Skip to content

Commit

Permalink
Better support for BGRA in D3D
Browse files Browse the repository at this point in the history
Make sure to check for BGRA before assuming we can do typed UAV loads. Also handle BGRA_TYPELESS.

Diffs=
c88898459 Better support for BGRA in D3D (#8022)
bf121f507 Bye bye rive_common (#8007)

Co-authored-by: Chris Dalton <[email protected]>
Co-authored-by: Hernan Torrisi <[email protected]>
Co-authored-by: Luigi Rosso <[email protected]>
  • Loading branch information
4 people committed Aug 30, 2024
1 parent 28b0354 commit b41389b
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 44 deletions.
2 changes: 1 addition & 1 deletion .rive_head
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bdd2e9bfdccb09db3cfea5aca30d926053fc1491
c8889845926d385f0649271fe6e2c37d6461c052
74 changes: 38 additions & 36 deletions renderer/src/d3d/render_context_d3d_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

#include "rive/renderer/d3d/render_context_d3d_impl.hpp"

#include "rive/renderer/rive_render_image.hpp"
#include "rive/renderer/texture.hpp"
#include "shaders/constants.glsl"

#include <D3DCompiler.h>
Expand Down Expand Up @@ -90,19 +90,24 @@ std::unique_ptr<RenderContext> RenderContextD3DImpl::MakeContext(
if (d3d11Options2.TypedUAVLoadAdditionalFormats)
{
// TypedUAVLoadAdditionalFormats is true. Now check if we can both load and
// store all formats used by Rive (currently only RGBA8):
// store all formats used by Rive (currently only RGBA8 and BGRA8):
// https://learn.microsoft.com/en-us/windows/win32/direct3d11/typed-unordered-access-view-loads.
D3D11_FEATURE_DATA_FORMAT_SUPPORT2 d3d11Format2{};
d3d11Format2.InFormat = DXGI_FORMAT_R8G8B8A8_UNORM;
if (SUCCEEDED(gpu->CheckFeatureSupport(D3D11_FEATURE_FORMAT_SUPPORT2,
&d3d11Format2,
sizeof(d3d11Format2))))
{
constexpr UINT loadStoreFlags = D3D11_FORMAT_SUPPORT2_UAV_TYPED_LOAD |
D3D11_FORMAT_SUPPORT2_UAV_TYPED_STORE;
d3dCapabilities.supportsTypedUAVLoadStore =
(d3d11Format2.OutFormatSupport2 & loadStoreFlags) == loadStoreFlags;
}
auto check_typed_uav_load = [gpu](DXGI_FORMAT format) {
D3D11_FEATURE_DATA_FORMAT_SUPPORT2 d3d11Format2{};
d3d11Format2.InFormat = format;
if (SUCCEEDED(gpu->CheckFeatureSupport(D3D11_FEATURE_FORMAT_SUPPORT2,
&d3d11Format2,
sizeof(d3d11Format2))))
{
constexpr UINT loadStoreFlags = D3D11_FORMAT_SUPPORT2_UAV_TYPED_LOAD |
D3D11_FORMAT_SUPPORT2_UAV_TYPED_STORE;
return (d3d11Format2.OutFormatSupport2 & loadStoreFlags) == loadStoreFlags;
}
return false;
};
d3dCapabilities.supportsTypedUAVLoadStore =
check_typed_uav_load(DXGI_FORMAT_R8G8B8A8_UNORM) &&
check_typed_uav_load(DXGI_FORMAT_B8G8R8A8_UNORM);
}
}

Expand Down Expand Up @@ -721,11 +726,11 @@ void RenderTargetD3D::setTargetTexture(ComPtr<ID3D11Texture2D> tex)
assert(desc.Height == height());
assert(desc.Format == DXGI_FORMAT_R8G8B8A8_UNORM ||
desc.Format == DXGI_FORMAT_B8G8R8A8_UNORM ||
desc.Format == DXGI_FORMAT_R8G8B8A8_TYPELESS);
desc.Format == DXGI_FORMAT_R8G8B8A8_TYPELESS ||
desc.Format == DXGI_FORMAT_B8G8R8A8_TYPELESS);
#endif
m_targetTextureSupportsUAV =
(desc.BindFlags & D3D11_BIND_UNORDERED_ACCESS) &&
(m_gpuSupportsTypedUAVLoadStore || desc.Format == DXGI_FORMAT_R8G8B8A8_TYPELESS);
(desc.BindFlags & D3D11_BIND_UNORDERED_ACCESS) && m_gpuSupportsTypedUAVLoadStore;
m_targetFormat = desc.Format;
}
else
Expand All @@ -747,12 +752,13 @@ ID3D11RenderTargetView* RenderTargetD3D::targetRTV()
switch (m_targetFormat)
{
case DXGI_FORMAT_R8G8B8A8_UNORM:
case DXGI_FORMAT_B8G8R8A8_UNORM:
desc.Format = m_targetFormat;
break;
case DXGI_FORMAT_R8G8B8A8_TYPELESS:
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
break;
case DXGI_FORMAT_B8G8R8A8_UNORM:
case DXGI_FORMAT_B8G8R8A8_TYPELESS:
desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
break;

default:
RIVE_UNREACHABLE();
Expand Down Expand Up @@ -788,24 +794,20 @@ ID3D11UnorderedAccessView* RenderTargetD3D::targetUAV()
m_targetTextureSupportsUAV ? m_targetTexture.Get() : offscreenTexture())
{
DXGI_FORMAT targetUavFormat;
if (m_gpuSupportsTypedUAVLoadStore)
{
switch (m_targetFormat)
{
case DXGI_FORMAT_R8G8B8A8_UNORM:
case DXGI_FORMAT_B8G8R8A8_UNORM:
targetUavFormat = m_targetFormat;
break;
case DXGI_FORMAT_R8G8B8A8_TYPELESS:
targetUavFormat = DXGI_FORMAT_R8G8B8A8_UNORM;
break;
default:
RIVE_UNREACHABLE();
}
}
else
switch (m_targetFormat)
{
targetUavFormat = DXGI_FORMAT_R32_UINT;
case DXGI_FORMAT_R8G8B8A8_UNORM:
case DXGI_FORMAT_R8G8B8A8_TYPELESS:
targetUavFormat = m_gpuSupportsTypedUAVLoadStore ? DXGI_FORMAT_R8G8B8A8_UNORM
: DXGI_FORMAT_R32_UINT;
break;
case DXGI_FORMAT_B8G8R8A8_UNORM:
case DXGI_FORMAT_B8G8R8A8_TYPELESS:
targetUavFormat = m_gpuSupportsTypedUAVLoadStore ? DXGI_FORMAT_B8G8R8A8_UNORM
: DXGI_FORMAT_R32_UINT;
break;
default:
RIVE_UNREACHABLE();
}
m_targetUAV = make_simple_2d_uav(m_gpu.Get(), uavTexture, targetUavFormat);
}
Expand Down
18 changes: 11 additions & 7 deletions src/shapes/mesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,14 +122,18 @@ void Mesh::onAssetLoaded(RenderImage* renderImage)
m_UVRenderBuffer->unmap();
}

m_IndexRenderBuffer = factory->makeRenderBuffer(RenderBufferType::index,
RenderBufferFlags::mappedOnceAtInitialization,
m_IndexBuffer->size() * sizeof(uint16_t));
if (m_IndexRenderBuffer)
if (m_IndexBuffer != nullptr)
{
void* indexData = m_IndexRenderBuffer->map();
memcpy(indexData, m_IndexBuffer->data(), m_IndexRenderBuffer->sizeInBytes());
m_IndexRenderBuffer->unmap();
m_IndexRenderBuffer =
factory->makeRenderBuffer(RenderBufferType::index,
RenderBufferFlags::mappedOnceAtInitialization,
m_IndexBuffer->size() * sizeof(uint16_t));
if (m_IndexRenderBuffer)
{
void* indexData = m_IndexRenderBuffer->map();
memcpy(indexData, m_IndexBuffer->data(), m_IndexRenderBuffer->sizeInBytes());
m_IndexRenderBuffer->unmap();
}
}
}

Expand Down

0 comments on commit b41389b

Please sign in to comment.