Publish native hosted preview textures through XCUI compositor
This commit is contained in:
@@ -13,6 +13,26 @@ namespace XCUIBackend {
|
||||
|
||||
namespace {
|
||||
|
||||
::XCEngine::RHI::ResourceViewDimension ResolveShaderResourceDimension(
|
||||
::XCEngine::RHI::TextureType textureType) {
|
||||
switch (textureType) {
|
||||
case ::XCEngine::RHI::TextureType::Texture1D:
|
||||
return ::XCEngine::RHI::ResourceViewDimension::Texture1D;
|
||||
case ::XCEngine::RHI::TextureType::Texture2D:
|
||||
return ::XCEngine::RHI::ResourceViewDimension::Texture2D;
|
||||
case ::XCEngine::RHI::TextureType::Texture2DArray:
|
||||
return ::XCEngine::RHI::ResourceViewDimension::Texture2DArray;
|
||||
case ::XCEngine::RHI::TextureType::Texture3D:
|
||||
return ::XCEngine::RHI::ResourceViewDimension::Texture3D;
|
||||
case ::XCEngine::RHI::TextureType::TextureCube:
|
||||
return ::XCEngine::RHI::ResourceViewDimension::TextureCube;
|
||||
case ::XCEngine::RHI::TextureType::TextureCubeArray:
|
||||
return ::XCEngine::RHI::ResourceViewDimension::TextureCubeArray;
|
||||
default:
|
||||
return ::XCEngine::RHI::ResourceViewDimension::Texture2D;
|
||||
}
|
||||
}
|
||||
|
||||
bool PrepareSwapChainRender(
|
||||
::XCEngine::Editor::Platform::D3D12WindowRenderer& windowRenderer,
|
||||
const float clearColor[4],
|
||||
@@ -172,14 +192,56 @@ bool NativeWindowUICompositor::CreateTextureDescriptor(
|
||||
::XCEngine::RHI::RHIDevice* device,
|
||||
::XCEngine::RHI::RHITexture* texture,
|
||||
UITextureRegistration& outRegistration) {
|
||||
(void)device;
|
||||
(void)texture;
|
||||
outRegistration = {};
|
||||
return false;
|
||||
if (device == nullptr || texture == nullptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
::XCEngine::RHI::ResourceViewDesc viewDesc = {};
|
||||
viewDesc.format = static_cast<std::uint32_t>(texture->GetFormat());
|
||||
viewDesc.dimension = ResolveShaderResourceDimension(texture->GetTextureType());
|
||||
viewDesc.mipLevel = 0u;
|
||||
|
||||
::XCEngine::RHI::RHIResourceView* shaderResourceView = device->CreateShaderResourceView(texture, viewDesc);
|
||||
if (shaderResourceView == nullptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!shaderResourceView->IsValid() ||
|
||||
shaderResourceView->GetViewType() != ::XCEngine::RHI::ResourceViewType::ShaderResource) {
|
||||
shaderResourceView->Shutdown();
|
||||
delete shaderResourceView;
|
||||
return false;
|
||||
}
|
||||
|
||||
outRegistration.cpuHandle.ptr =
|
||||
reinterpret_cast<std::uintptr_t>(shaderResourceView->GetNativeHandle());
|
||||
outRegistration.texture.nativeHandle =
|
||||
reinterpret_cast<std::uintptr_t>(shaderResourceView);
|
||||
outRegistration.texture.width = texture->GetWidth();
|
||||
outRegistration.texture.height = texture->GetHeight();
|
||||
outRegistration.texture.kind = ::XCEngine::UI::UITextureHandleKind::ShaderResourceView;
|
||||
|
||||
if (!outRegistration.IsValid()) {
|
||||
shaderResourceView->Shutdown();
|
||||
delete shaderResourceView;
|
||||
outRegistration = {};
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void NativeWindowUICompositor::FreeTextureDescriptor(const UITextureRegistration& registration) {
|
||||
(void)registration;
|
||||
if (registration.texture.kind != ::XCEngine::UI::UITextureHandleKind::ShaderResourceView ||
|
||||
registration.texture.nativeHandle == 0u) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto* shaderResourceView =
|
||||
reinterpret_cast<::XCEngine::RHI::RHIResourceView*>(registration.texture.nativeHandle);
|
||||
shaderResourceView->Shutdown();
|
||||
delete shaderResourceView;
|
||||
}
|
||||
|
||||
void NativeWindowUICompositor::SubmitRenderPacket(const XCUINativeWindowRenderPacket& packet) {
|
||||
|
||||
Reference in New Issue
Block a user