Error Is::getOrCreatePipeline(ShaderVariantBit variantMask, RenderingContext& ctx, PipelinePtr& ppline) { auto it = m_shaderVariantMap.find(variantMask); if(it != m_shaderVariantMap.getEnd()) { ppline = it->m_lightPpline; } else { StringAuto pps(ctx.m_tempAllocator); pps.sprintf("#define TILE_COUNT_X %u\n" "#define TILE_COUNT_Y %u\n" "#define CLUSTER_COUNT %u\n" "#define RENDERER_WIDTH %u\n" "#define RENDERER_HEIGHT %u\n" "#define MAX_LIGHT_INDICES %u\n" "#define POISSON %u\n" "#define INDIRECT_ENABLED %u\n" "#define IR_MIPMAP_COUNT %u\n" "#define POINT_LIGHTS_ENABLED %u\n" "#define SPOT_LIGHTS_ENABLED %u\n" "#define DECALS_ENABLED %u\n" "#define POINT_LIGHTS_SHADOWS_ENABLED %u\n" "#define SPOT_LIGHTS_SHADOWS_ENABLED %u\n", m_r->getTileCountXY().x(), m_r->getTileCountXY().y(), m_clusterCount, m_r->getWidth(), m_r->getHeight(), m_maxLightIds, m_r->getSm().getPoissonEnabled(), !!(variantMask & ShaderVariantBit::INDIRECT), m_r->getIr().getReflectionTextureMipmapCount(), !!(variantMask & ShaderVariantBit::P_LIGHTS), !!(variantMask & ShaderVariantBit::S_LIGHTS), !!(variantMask & ShaderVariantBit::DECALS), !!(variantMask & ShaderVariantBit::P_LIGHTS_SHADOWS), !!(variantMask & ShaderVariantBit::S_LIGHTS_SHADOWS)); ShaderVariant variant; ANKI_CHECK(getResourceManager().loadResourceToCache( variant.m_lightFrag, "shaders/Is.frag.glsl", pps.toCString(), "r_")); PipelineInitInfo init; init.m_inputAssembler.m_topology = PrimitiveTopology::TRIANGLE_STRIP; init.m_depthStencil.m_depthWriteEnabled = false; init.m_depthStencil.m_depthCompareFunction = CompareOperation::ALWAYS; init.m_color.m_attachmentCount = 1; init.m_color.m_attachments[0].m_format = IS_COLOR_ATTACHMENT_PIXEL_FORMAT; init.m_shaders[U(ShaderType::VERTEX)] = m_lightVert->getGrShader(); init.m_shaders[U(ShaderType::FRAGMENT)] = m_lightFrag->getGrShader(); variant.m_lightPpline = getGrManager().newInstance<Pipeline>(init); ppline = variant.m_lightPpline; m_shaderVariantMap.pushBack(getAllocator(), variantMask, variant); } return ErrorCode::NONE; }
Error Is::initInternal(const ConfigSet& config) { m_maxLightIds = config.getNumber("is.maxLightsPerCluster"); if(m_maxLightIds == 0) { ANKI_LOGE("Incorrect number of max light indices"); return ErrorCode::USER_DATA; } m_rtMipCount = computeMaxMipmapCount2d(m_r->getWidth(), m_r->getHeight(), 32); ANKI_ASSERT(m_rtMipCount); U clusterCount = m_r->getTileCountXY().x() * m_r->getTileCountXY().y() * config.getNumber("clusterSizeZ"); m_clusterCount = clusterCount; m_maxLightIds *= clusterCount; m_lightBin = getAllocator().newInstance<LightBin>(getAllocator(), m_r->getTileCountXY().x(), m_r->getTileCountXY().y(), config.getNumber("clusterSizeZ"), &m_r->getThreadPool(), &getGrManager()); // // Load the programs // StringAuto pps(getAllocator()); pps.sprintf("\n#define TILE_COUNT_X %u\n" "#define TILE_COUNT_Y %u\n" "#define CLUSTER_COUNT %u\n" "#define RENDERER_WIDTH %u\n" "#define RENDERER_HEIGHT %u\n" "#define MAX_LIGHT_INDICES %u\n" "#define POISSON %u\n" "#define INDIRECT_ENABLED %u\n" "#define IR_MIPMAP_COUNT %u\n", m_r->getTileCountXY().x(), m_r->getTileCountXY().y(), clusterCount, m_r->getWidth(), m_r->getHeight(), m_maxLightIds, m_r->getSm().getPoissonEnabled(), 1, m_r->getIr().getReflectionTextureMipmapCount()); // point light ANKI_CHECK(getResourceManager().loadResourceToCache(m_lightVert, "shaders/Is.vert.glsl", pps.toCString(), "r_")); ANKI_CHECK(getResourceManager().loadResourceToCache(m_lightFrag, "shaders/Is.frag.glsl", pps.toCString(), "r_")); PipelineInitInfo init; init.m_inputAssembler.m_topology = PrimitiveTopology::TRIANGLE_STRIP; init.m_depthStencil.m_depthWriteEnabled = false; init.m_depthStencil.m_depthCompareFunction = CompareOperation::ALWAYS; init.m_color.m_attachmentCount = 1; init.m_color.m_attachments[0].m_format = IS_COLOR_ATTACHMENT_PIXEL_FORMAT; init.m_shaders[U(ShaderType::VERTEX)] = m_lightVert->getGrShader(); init.m_shaders[U(ShaderType::FRAGMENT)] = m_lightFrag->getGrShader(); m_lightPpline = getGrManager().newInstance<Pipeline>(init); // // Create framebuffer // m_r->createRenderTarget(m_r->getWidth(), m_r->getHeight(), IS_COLOR_ATTACHMENT_PIXEL_FORMAT, TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE | TextureUsageBit::SAMPLED_COMPUTE, SamplingFilter::LINEAR, m_rtMipCount, m_rt); FramebufferInitInfo fbInit; fbInit.m_colorAttachmentCount = 1; fbInit.m_colorAttachments[0].m_texture = m_rt; fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::DONT_CARE; fbInit.m_colorAttachments[0].m_usageInsideRenderPass = TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE; m_fb = getGrManager().newInstance<Framebuffer>(fbInit); // // Create resource group // { ResourceGroupInitInfo init; init.m_textures[0].m_texture = m_r->getMs().m_rt0; init.m_textures[1].m_texture = m_r->getMs().m_rt1; init.m_textures[2].m_texture = m_r->getMs().m_rt2; init.m_textures[3].m_texture = m_r->getMs().m_depthRt; init.m_textures[3].m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ; init.m_textures[4].m_texture = m_r->getSm().getSpotTextureArray(); init.m_textures[5].m_texture = m_r->getSm().getOmniTextureArray(); init.m_textures[6].m_texture = m_r->getIr().getReflectionTexture(); init.m_textures[7].m_texture = m_r->getIr().getIrradianceTexture(); init.m_textures[8].m_texture = m_r->getIr().getIntegrationLut(); init.m_textures[8].m_sampler = m_r->getIr().getIntegrationLutSampler(); init.m_uniformBuffers[0].m_uploadedMemory = true; init.m_uniformBuffers[0].m_usage = BufferUsageBit::UNIFORM_FRAGMENT | BufferUsageBit::UNIFORM_VERTEX; init.m_uniformBuffers[1].m_uploadedMemory = true; init.m_uniformBuffers[1].m_usage = BufferUsageBit::UNIFORM_FRAGMENT | BufferUsageBit::UNIFORM_VERTEX; init.m_uniformBuffers[2].m_uploadedMemory = true; init.m_uniformBuffers[2].m_usage = BufferUsageBit::UNIFORM_FRAGMENT | BufferUsageBit::UNIFORM_VERTEX; init.m_uniformBuffers[3].m_uploadedMemory = true; init.m_uniformBuffers[3].m_usage = BufferUsageBit::UNIFORM_FRAGMENT | BufferUsageBit::UNIFORM_VERTEX; init.m_uniformBuffers[4].m_uploadedMemory = true; init.m_uniformBuffers[4].m_usage = BufferUsageBit::UNIFORM_FRAGMENT | BufferUsageBit::UNIFORM_VERTEX; init.m_storageBuffers[0].m_uploadedMemory = true; init.m_storageBuffers[0].m_usage = BufferUsageBit::STORAGE_FRAGMENT_READ | BufferUsageBit::STORAGE_VERTEX_READ; init.m_storageBuffers[1].m_uploadedMemory = true; init.m_storageBuffers[1].m_usage = BufferUsageBit::STORAGE_FRAGMENT_READ | BufferUsageBit::STORAGE_VERTEX_READ; m_rcGroup = getGrManager().newInstance<ResourceGroup>(init); } TextureInitInfo texinit; texinit.m_width = texinit.m_height = 4; texinit.m_usage = TextureUsageBit::SAMPLED_FRAGMENT; texinit.m_format = PixelFormat(ComponentFormat::R8G8B8A8, TransformFormat::UNORM); m_dummyTex = getGrManager().newInstance<Texture>(texinit); return ErrorCode::NONE; }
Error TextureAtlasResource::load(const ResourceFilename& filename, Bool async) { XmlDocument doc; ANKI_CHECK(openFileParseXml(filename, doc)); XmlElement rootel, el; // // <textureAtlas> // ANKI_CHECK(doc.getChildElement("textureAtlas", rootel)); // // <texture> // ANKI_CHECK(rootel.getChildElement("texture", el)); CString texFname; ANKI_CHECK(el.getText(texFname)); ANKI_CHECK(getManager().loadResource<TextureResource>(texFname, m_tex, async)); m_size[0] = m_tex->getWidth(); m_size[1] = m_tex->getHeight(); // // <subTextureMargin> // ANKI_CHECK(rootel.getChildElement("subTextureMargin", el)); I64 margin = 0; ANKI_CHECK(el.getNumber(margin)); if(margin >= I(m_tex->getWidth()) || margin >= I(m_tex->getHeight()) || margin < 0) { ANKI_RESOURCE_LOGE("Too big margin %d", U(margin)); return Error::USER_DATA; } m_margin = margin; // // <subTextures> // // Get counts PtrSize namesSize = 0; PtrSize subTexesCount = 0; XmlElement subTexesEl, subTexEl; ANKI_CHECK(rootel.getChildElement("subTextures", subTexesEl)); ANKI_CHECK(subTexesEl.getChildElement("subTexture", subTexEl)); do { ANKI_CHECK(subTexEl.getChildElement("name", el)); CString name; ANKI_CHECK(el.getText(name)); if(name.getLength() < 1) { ANKI_RESOURCE_LOGE("Something wrong with the <name> tag. Probably empty"); return Error::USER_DATA; } namesSize += name.getLength() + 1; ++subTexesCount; ANKI_CHECK(subTexEl.getNextSiblingElement("subTexture", subTexEl)); } while(subTexEl); // Allocate m_subTexNames.create(getAllocator(), namesSize); m_subTexes.create(getAllocator(), subTexesCount); // Iterate again and populate subTexesCount = 0; char* names = &m_subTexNames[0]; ANKI_CHECK(subTexesEl.getChildElement("subTexture", subTexEl)); do { ANKI_CHECK(subTexEl.getChildElement("name", el)); CString name; ANKI_CHECK(el.getText(name)); memcpy(names, &name[0], name.getLength() + 1); m_subTexes[subTexesCount].m_name = names; ANKI_CHECK(subTexEl.getChildElement("uv", el)); Vec4 uv; ANKI_CHECK(el.getVec4(uv)); m_subTexes[subTexesCount].m_uv = {{uv[0], uv[1], uv[2], uv[3]}}; names += name.getLength() + 1; ++subTexesCount; ANKI_CHECK(subTexEl.getNextSiblingElement("subTexture", subTexEl)); } while(subTexEl); return Error::NONE; }