summaryrefslogtreecommitdiffstats
path: root/tools/gfx
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2022-10-13 14:07:26 -0700
committerGitHub <noreply@github.com>2022-10-13 14:07:26 -0700
commit09054f7ae00aad0458de465a7f0b780a91c694dd (patch)
tree776f50b5ebe51ae7088d6990eaa5f6d84d8a6c2a /tools/gfx
parentafa9f4b2786c92e72a563f316e074f62770630cb (diff)
Make `optimalClearValue` optional in `ITextureResource::Desc` (#2450)
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'tools/gfx')
-rw-r--r--tools/gfx/d3d11/d3d11-device.cpp15
-rw-r--r--tools/gfx/d3d12/d3d12-device.cpp31
-rw-r--r--tools/gfx/gfx.slang2
-rw-r--r--tools/gfx/open-gl/render-gl.cpp16
-rw-r--r--tools/gfx/vulkan/vk-framebuffer.cpp22
5 files changed, 58 insertions, 28 deletions
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.