diff options
| author | Yong He <yonghe@outlook.com> | 2022-10-13 14:07:26 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-10-13 14:07:26 -0700 |
| commit | 09054f7ae00aad0458de465a7f0b780a91c694dd (patch) | |
| tree | 776f50b5ebe51ae7088d6990eaa5f6d84d8a6c2a | |
| parent | afa9f4b2786c92e72a563f316e074f62770630cb (diff) | |
Make `optimalClearValue` optional in `ITextureResource::Desc` (#2450)
Co-authored-by: Yong He <yhe@nvidia.com>
| -rw-r--r-- | slang-gfx.h | 2 | ||||
| -rw-r--r-- | tools/gfx/d3d11/d3d11-device.cpp | 15 | ||||
| -rw-r--r-- | tools/gfx/d3d12/d3d12-device.cpp | 31 | ||||
| -rw-r--r-- | tools/gfx/gfx.slang | 2 | ||||
| -rw-r--r-- | tools/gfx/open-gl/render-gl.cpp | 16 | ||||
| -rw-r--r-- | tools/gfx/vulkan/vk-framebuffer.cpp | 22 |
6 files changed, 59 insertions, 29 deletions
diff --git a/slang-gfx.h b/slang-gfx.h index 2acb8bf1a..3e30a6a32 100644 --- a/slang-gfx.h +++ b/slang-gfx.h @@ -706,7 +706,7 @@ public: GfxCount numMipLevels = 0; ///< Number of mip levels - if 0 will create all mip levels Format format; ///< The resources format SampleDesc sampleDesc; ///< How the resource is sampled - ClearValue optimalClearValue; + ClearValue* optimalClearValue = nullptr; }; /// Data for a single subresource of a texture. diff --git a/tools/gfx/d3d11/d3d11-device.cpp b/tools/gfx/d3d11/d3d11-device.cpp index 969eb7d1b..fbc24c9ce 100644 --- a/tools/gfx/d3d11/d3d11-device.cpp +++ b/tools/gfx/d3d11/d3d11-device.cpp @@ -668,11 +668,13 @@ Result DeviceImpl::createTextureView(ITextureResource* texture, IResourceView::D viewImpl->m_type = ResourceViewImpl::Type::RTV; viewImpl->m_rtv = rtv; viewImpl->m_desc = desc; - - memcpy( - viewImpl->m_clearValue, - &resourceImpl->getDesc()->optimalClearValue.color, - sizeof(float) * 4); + if (resourceImpl->getDesc()->optimalClearValue) + { + memcpy( + viewImpl->m_clearValue, + &resourceImpl->getDesc()->optimalClearValue->color, + sizeof(float) * 4); + } returnComPtr(outView, viewImpl); return SLANG_OK; } @@ -686,7 +688,8 @@ Result DeviceImpl::createTextureView(ITextureResource* texture, IResourceView::D RefPtr<DepthStencilViewImpl> viewImpl = new DepthStencilViewImpl(); viewImpl->m_type = ResourceViewImpl::Type::DSV; viewImpl->m_dsv = dsv; - viewImpl->m_clearValue = resourceImpl->getDesc()->optimalClearValue.depthStencil; + if (resourceImpl->getDesc()->optimalClearValue) + viewImpl->m_clearValue = resourceImpl->getDesc()->optimalClearValue->depthStencil; viewImpl->m_desc = desc; returnComPtr(outView, viewImpl); diff --git a/tools/gfx/d3d12/d3d12-device.cpp b/tools/gfx/d3d12/d3d12-device.cpp index 2d9780b0f..dbc2a18d9 100644 --- a/tools/gfx/d3d12/d3d12-device.cpp +++ b/tools/gfx/d3d12/d3d12-device.cpp @@ -941,7 +941,7 @@ Result DeviceImpl::createTextureResource( flags |= D3D12_HEAP_FLAG_SHARED; D3D12_CLEAR_VALUE clearValue; - D3D12_CLEAR_VALUE* clearValuePtr = &clearValue; + D3D12_CLEAR_VALUE* clearValuePtr = nullptr; if ((resourceDesc.Flags & (D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET | D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL)) == 0) { @@ -952,9 +952,13 @@ Result DeviceImpl::createTextureResource( clearValuePtr = nullptr; } clearValue.Format = resourceDesc.Format; - memcpy(clearValue.Color, &descIn.optimalClearValue.color, sizeof(clearValue.Color)); - clearValue.DepthStencil.Depth = descIn.optimalClearValue.depthStencil.depth; - clearValue.DepthStencil.Stencil = descIn.optimalClearValue.depthStencil.stencil; + if (descIn.optimalClearValue) + { + memcpy(clearValue.Color, &descIn.optimalClearValue->color, sizeof(clearValue.Color)); + clearValue.DepthStencil.Depth = descIn.optimalClearValue->depthStencil.depth; + clearValue.DepthStencil.Stencil = descIn.optimalClearValue->depthStencil.stencil; + clearValuePtr = &clearValue; + } SLANG_RETURN_ON_FAIL(texture->m_resource.initCommitted( m_device, heapProps, @@ -1633,8 +1637,11 @@ Result DeviceImpl::createFramebuffer(IFramebuffer::Desc const& desc, IFramebuffe static_cast<TextureResourceImpl*>( static_cast<ResourceViewImpl*>(desc.renderTargetViews[i])->m_resource.Ptr()) ->getDesc() - ->optimalClearValue.color; - memcpy(&framebuffer->renderTargetClearValues[i], &clearValue, sizeof(ColorClearValue)); + ->optimalClearValue; + if (clearValue) + { + memcpy(&framebuffer->renderTargetClearValues[i], &clearValue->color, sizeof(ColorClearValue)); + } } else { @@ -1644,11 +1651,15 @@ Result DeviceImpl::createFramebuffer(IFramebuffer::Desc const& desc, IFramebuffe framebuffer->depthStencilView = static_cast<ResourceViewImpl*>(desc.depthStencilView); if (desc.depthStencilView) { - framebuffer->depthStencilClearValue = - static_cast<TextureResourceImpl*>( - static_cast<ResourceViewImpl*>(desc.depthStencilView)->m_resource.Ptr()) + auto clearValue = static_cast<TextureResourceImpl*>( + static_cast<ResourceViewImpl*>(desc.depthStencilView)->m_resource.Ptr()) ->getDesc() - ->optimalClearValue.depthStencil; + ->optimalClearValue; + + if (clearValue) + { + framebuffer->depthStencilClearValue = clearValue->depthStencil; + } framebuffer->depthStencilDescriptor = static_cast<ResourceViewImpl*>(desc.depthStencilView)->m_descriptor.cpuHandle; } diff --git a/tools/gfx/gfx.slang b/tools/gfx/gfx.slang index c1296b472..13359334f 100644 --- a/tools/gfx/gfx.slang +++ b/tools/gfx/gfx.slang @@ -486,7 +486,7 @@ struct TextureResourceDesc : ResourceDescBase GfxCount numMipLevels = 0; ///< Number of mip levels - if 0 will create all mip levels Format format; ///< The resources format TextureResourceSampleDesc sampleDesc; ///< How the resource is sampled - ClearValue optimalClearValue; + ClearValue* optimalClearValue; }; /// Data for a single subresource of a texture. diff --git a/tools/gfx/open-gl/render-gl.cpp b/tools/gfx/open-gl/render-gl.cpp index fdec875f0..f6fe5c9af 100644 --- a/tools/gfx/open-gl/render-gl.cpp +++ b/tools/gfx/open-gl/render-gl.cpp @@ -400,7 +400,14 @@ public: renderer->glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + (uint32_t)i, GL_TEXTURE_2D, rtv->m_textureID, 0); m_drawBuffers.add((GLenum)(GL_COLOR_ATTACHMENT0 + i)); - m_colorClearValues.add(rtv->m_resource->getDesc()->optimalClearValue.color); + if (rtv->m_resource->getDesc()->optimalClearValue) + { + m_colorClearValues.add(rtv->m_resource->getDesc()->optimalClearValue->color); + } + else + { + m_colorClearValues.add(ColorClearValue()); + } } m_sameClearValues = true; for (Index i = 1; i < m_colorClearValues.getCount() && m_sameClearValues; i++) @@ -423,8 +430,11 @@ public: GL_TEXTURE_2D, depthStencilView->m_textureID, 0); - m_depthStencilClearValue = - depthStencilView->m_resource->getDesc()->optimalClearValue.depthStencil; + if (depthStencilView->m_resource->getDesc()->optimalClearValue) + { + m_depthStencilClearValue = + depthStencilView->m_resource->getDesc()->optimalClearValue->depthStencil; + } } auto error = renderer->glCheckFramebufferStatus(GL_FRAMEBUFFER); if (error != GL_FRAMEBUFFER_COMPLETE) diff --git a/tools/gfx/vulkan/vk-framebuffer.cpp b/tools/gfx/vulkan/vk-framebuffer.cpp index 0cc2a7799..e3e28816e 100644 --- a/tools/gfx/vulkan/vk-framebuffer.cpp +++ b/tools/gfx/vulkan/vk-framebuffer.cpp @@ -164,20 +164,26 @@ Result FramebufferImpl::init(DeviceImpl* renderer, const IFramebuffer::Desc& des auto resourceView = static_cast<TextureResourceViewImpl*>(desc.renderTargetViews[i]); renderTargetViews[i] = resourceView; imageViews[i] = resourceView->m_view; - memcpy( - &m_clearValues[i], - &resourceView->m_texture->getDesc()->optimalClearValue.color, - sizeof(gfx::ColorClearValue)); + if (resourceView->m_texture->getDesc()->optimalClearValue) + { + memcpy( + &m_clearValues[i], + &resourceView->m_texture->getDesc()->optimalClearValue->color, + sizeof(gfx::ColorClearValue)); + } } if (dsv) { imageViews[desc.renderTargetCount] = dsv->m_view; depthStencilView = dsv; - memcpy( - &m_clearValues[desc.renderTargetCount], - &dsv->m_texture->getDesc()->optimalClearValue.depthStencil, - sizeof(gfx::DepthStencilClearValue)); + if (dsv->m_texture->getDesc()->optimalClearValue) + { + memcpy( + &m_clearValues[desc.renderTargetCount], + &dsv->m_texture->getDesc()->optimalClearValue->depthStencil, + sizeof(gfx::DepthStencilClearValue)); + } } // Create framebuffer. |
