// Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors. // All rights reserved. // Code licensed under the BSD License. // http://www.anki3d.org/LICENSE #include #include #include #include #include #include #include #include namespace anki { Error RtMaterialFetchDbg::init() { ANKI_CHECK(RtMaterialFetchRendererObject::init()); // Ray gen and miss { ANKI_CHECK(ResourceManager::getSingleton().loadResource("ShaderBinaries/RtMaterialFetchDbg.ankiprogbin", m_rtProg)); ShaderProgramResourceVariantInitInfo variantInitInfo(m_rtProg); variantInitInfo.requestTechniqueAndTypes(ShaderTypeBit::kRayGen, "RtMaterialFetch"); const ShaderProgramResourceVariant* variant; m_rtProg->getOrCreateVariant(variantInitInfo, variant); m_libraryGrProg.reset(&variant->getProgram()); m_rayGenShaderGroupIdx = variant->getShaderGroupHandleIndex(); } { ANKI_CHECK(ResourceManager::getSingleton().loadResource("ShaderBinaries/RtMaterialFetchMiss.ankiprogbin", m_missProg)); ShaderProgramResourceVariantInitInfo variantInitInfo(m_missProg); variantInitInfo.requestTechniqueAndTypes(ShaderTypeBit::kMiss, "RtMaterialFetch"); const ShaderProgramResourceVariant* variant; m_missProg->getOrCreateVariant(variantInitInfo, variant); m_missShaderGroupIdx = variant->getShaderGroupHandleIndex(); } m_sbtRecordSize = getAlignedRoundUp(GrManager::getSingleton().getDeviceCapabilities().m_sbtRecordAlignment, GrManager::getSingleton().getDeviceCapabilities().m_shaderGroupHandleSize + U32(sizeof(UVec4))); m_rtDesc = getRenderer().create2DRenderTargetDescription(getRenderer().getInternalResolution().x, getRenderer().getInternalResolution().y, Format::kR8G8B8A8_Unorm, "RtMaterialFetch"); m_rtDesc.bake(); return Error::kNone; } void RtMaterialFetchDbg::populateRenderGraph(RenderingContext& ctx) { RenderGraphBuilder& rgraph = ctx.m_renderGraphDescr; // SBT build BufferHandle sbtHandle; BufferView sbtBuffer; buildShaderBindingTablePass("RtMaterialFetchDbg: Build SBT", m_libraryGrProg.get(), m_rayGenShaderGroupIdx, m_missShaderGroupIdx, m_sbtRecordSize, rgraph, sbtHandle, sbtBuffer); // Ray gen { m_runCtx.m_rt = rgraph.newRenderTarget(m_rtDesc); NonGraphicsRenderPass& rpass = rgraph.newNonGraphicsRenderPass("RtMaterialFetch"); rpass.newBufferDependency(sbtHandle, BufferUsageBit::kShaderBindingTable); rpass.newTextureDependency(m_runCtx.m_rt, TextureUsageBit::kUavDispatchRays); setRgenSpace2Dependencies(rpass); rpass.newAccelerationStructureDependency(getRenderer().getAccelerationStructureBuilder().getAccelerationStructureHandle(), AccelerationStructureUsageBit::kSrvDispatchRays); rpass.setWork([this, sbtBuffer, &ctx](RenderPassWorkContext& rgraphCtx) { ANKI_TRACE_SCOPED_EVENT(RtMaterialFetchRayGen); CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer; cmdb.bindShaderProgram(m_libraryGrProg.get()); // More globals cmdb.bindSampler(ANKI_MATERIAL_REGISTER_TILINEAR_REPEAT_SAMPLER, 0, getRenderer().getSamplers().m_trilinearRepeat.get()); cmdb.bindSrv(ANKI_MATERIAL_REGISTER_GPU_SCENE, 0, GpuSceneBuffer::getSingleton().getBufferView()); cmdb.bindSrv(ANKI_MATERIAL_REGISTER_MESH_LODS, 0, GpuSceneArrays::MeshLod::getSingleton().getBufferView()); cmdb.bindSrv(ANKI_MATERIAL_REGISTER_TRANSFORMS, 0, GpuSceneArrays::Transform::getSingleton().getBufferView()); cmdb.bindSrv(ANKI_MATERIAL_REGISTER_UNIFIED_GEOMETRY, 0, UnifiedGeometryBuffer::getSingleton().getBufferView()); #define ANKI_UNIFIED_GEOM_FORMAT(fmt, shaderType, reg) \ cmdb.bindSrv( \ reg, 0, \ BufferView(&UnifiedGeometryBuffer::getSingleton().getBuffer(), 0, \ getAlignedRoundDown(getFormatInfo(Format::k##fmt).m_texelSize, UnifiedGeometryBuffer::getSingleton().getBuffer().getSize())), \ Format::k##fmt); #include bindRgenSpace2Resources(ctx, rgraphCtx); rgraphCtx.bindUav(0, 2, m_runCtx.m_rt); Vec4 dummy[3]; cmdb.setFastConstants(&dummy, sizeof(dummy)); cmdb.dispatchRays(sbtBuffer, m_sbtRecordSize, GpuSceneArrays::RenderableBoundingVolumeRt::getSingleton().getElementCount(), 1, getRenderer().getInternalResolution().x, getRenderer().getInternalResolution().y, 1); }); } } } // end namespace anki