Publish native hosted preview textures through XCUI compositor

This commit is contained in:
2026-04-05 14:36:02 +08:00
parent 231df6ee36
commit b05e76de0c
7 changed files with 605 additions and 36 deletions

View File

@@ -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) {