From e7c2c69edba13d695d422fe6ce60aae869bff277 Mon Sep 17 00:00:00 2001 From: Gary Hsu Date: Sat, 25 Oct 2025 22:12:34 -0700 Subject: [PATCH] Add optional layerIndex argument to overrideInternal (#3477) * Add optional layerIndex argument to overrideInternal * Run genie idl --- bindings/bf/bgfx.bf | 3 ++- bindings/c3/bgfx.c3 | 3 ++- bindings/cs/bgfx.cs | 3 ++- bindings/d/package.d | 3 ++- bindings/zig/bgfx.zig | 7 ++++--- include/bgfx/c99/bgfx.h | 5 +++-- include/bgfx/platform.h | 3 ++- scripts/bgfx.idl | 9 +++++---- src/bgfx.cpp | 4 ++-- src/bgfx.idl.inl | 4 ++-- src/bgfx_p.h | 2 +- src/renderer_d3d11.cpp | 18 +++++++++++++++--- src/renderer_d3d11.h | 2 +- src/renderer_d3d12.cpp | 2 +- src/renderer_gl.cpp | 2 +- src/renderer_mtl.mm | 2 +- src/renderer_noop.cpp | 2 +- src/renderer_vk.cpp | 2 +- 18 files changed, 48 insertions(+), 28 deletions(-) diff --git a/bindings/bf/bgfx.bf b/bindings/bf/bgfx.bf index eefd6dad8..132a3e450 100644 --- a/bindings/bf/bgfx.bf +++ b/bindings/bf/bgfx.bf @@ -4197,9 +4197,10 @@ public static class bgfx /// /// Texture handle. /// Native API pointer to texture. + /// Layer index for texture arrays (only implemented for D3D11). /// [LinkName("bgfx_override_internal_texture_ptr")] - public static extern void* override_internal_texture_ptr(TextureHandle _handle, void* _ptr); + public static extern void* override_internal_texture_ptr(TextureHandle _handle, void* _ptr, uint32 _layerIndex); /// /// Override internal texture by creating new texture. Previously created diff --git a/bindings/c3/bgfx.c3 b/bindings/c3/bgfx.c3 index cc76e2cce..6775b94d6 100644 --- a/bindings/c3/bgfx.c3 +++ b/bindings/c3/bgfx.c3 @@ -2897,7 +2897,8 @@ extern fn InternalData* get_internal_data() @extern("bgfx_get_internal_data"); // @warning Must be called only on render thread. // _handle : `Texture handle.` // _ptr : `Native API pointer to texture.` -extern fn uptr override_internal_texture_ptr(TextureHandle _handle, uptr _ptr) @extern("bgfx_override_internal_texture_ptr"); +// _layerIndex : `Layer index for texture arrays (only implemented for D3D11).` +extern fn uptr override_internal_texture_ptr(TextureHandle _handle, uptr _ptr, uint _layerIndex) @extern("bgfx_override_internal_texture_ptr"); // Override internal texture by creating new texture. Previously created // internal texture will released. diff --git a/bindings/cs/bgfx.cs b/bindings/cs/bgfx.cs index 5fc23c5af..43a764b61 100644 --- a/bindings/cs/bgfx.cs +++ b/bindings/cs/bgfx.cs @@ -4152,9 +4152,10 @@ public static partial class bgfx /// /// Texture handle. /// Native API pointer to texture. + /// Layer index for texture arrays (only implemented for D3D11). /// [DllImport(DllName, EntryPoint="bgfx_override_internal_texture_ptr", CallingConvention = CallingConvention.Cdecl)] - public static extern unsafe UIntPtr override_internal_texture_ptr(TextureHandle _handle, UIntPtr _ptr); + public static extern unsafe UIntPtr override_internal_texture_ptr(TextureHandle _handle, UIntPtr _ptr, uint _layerIndex); /// /// Override internal texture by creating new texture. Previously created diff --git a/bindings/d/package.d b/bindings/d/package.d index 961cdcd08..63086b50e 100644 --- a/bindings/d/package.d +++ b/bindings/d/package.d @@ -3091,8 +3091,9 @@ mixin(joinFnBinds((){ Params: handle = Texture handle. ptr = Native API pointer to texture. + layerIndex = Layer index for texture arrays (only implemented for D3D11). */ - {q{size_t}, q{overrideInternal}, q{TextureHandle handle, size_t ptr}, ext: `C++, "bgfx"`}, + {q{size_t}, q{overrideInternal}, q{TextureHandle handle, size_t ptr, uint layerIndex}, ext: `C++, "bgfx"`}, /** * Override internal texture by creating new texture. Previously created diff --git a/bindings/zig/bgfx.zig b/bindings/zig/bgfx.zig index c0df3c24e..9a7ef109e 100644 --- a/bindings/zig/bgfx.zig +++ b/bindings/zig/bgfx.zig @@ -3284,10 +3284,11 @@ extern fn bgfx_get_internal_data() [*c]const InternalData; /// @warning Must be called only on render thread. /// Texture handle. /// Native API pointer to texture. -pub inline fn overrideInternalTexturePtr(_handle: TextureHandle, _ptr: usize) usize { - return bgfx_override_internal_texture_ptr(_handle, _ptr); +/// Layer index for texture arrays (only implemented for D3D11). +pub inline fn overrideInternalTexturePtr(_handle: TextureHandle, _ptr: usize, _layerIndex: u32) usize { + return bgfx_override_internal_texture_ptr(_handle, _ptr, _layerIndex); } -extern fn bgfx_override_internal_texture_ptr(_handle: TextureHandle, _ptr: usize) usize; +extern fn bgfx_override_internal_texture_ptr(_handle: TextureHandle, _ptr: usize, _layerIndex: u32) usize; /// Override internal texture by creating new texture. Previously created /// internal texture will released. diff --git a/include/bgfx/c99/bgfx.h b/include/bgfx/c99/bgfx.h index 1033ee733..b54f7dd35 100644 --- a/include/bgfx/c99/bgfx.h +++ b/include/bgfx/c99/bgfx.h @@ -2952,12 +2952,13 @@ BGFX_C_API const bgfx_internal_data_t* bgfx_get_internal_data(void); * * @param[in] _handle Texture handle. * @param[in] _ptr Native API pointer to texture. + * @param[in] _layerIndex Layer index for texture arrays (only implemented for D3D11). * * @returns Native API pointer to texture. If result is 0, texture is not created * yet from the main thread. * */ -BGFX_C_API uintptr_t bgfx_override_internal_texture_ptr(bgfx_texture_handle_t _handle, uintptr_t _ptr); +BGFX_C_API uintptr_t bgfx_override_internal_texture_ptr(bgfx_texture_handle_t _handle, uintptr_t _ptr, uint32_t _layerIndex); /** * Override internal texture by creating new texture. Previously created @@ -3843,7 +3844,7 @@ struct bgfx_interface_vtbl bgfx_render_frame_t (*render_frame)(int32_t _msecs); void (*set_platform_data)(const bgfx_platform_data_t * _data); const bgfx_internal_data_t* (*get_internal_data)(void); - uintptr_t (*override_internal_texture_ptr)(bgfx_texture_handle_t _handle, uintptr_t _ptr); + uintptr_t (*override_internal_texture_ptr)(bgfx_texture_handle_t _handle, uintptr_t _ptr, uint32_t _layerIndex); uintptr_t (*override_internal_texture)(bgfx_texture_handle_t _handle, uint16_t _width, uint16_t _height, uint8_t _numMips, bgfx_texture_format_t _format, uint64_t _flags); void (*set_marker)(const char* _name, int32_t _len); void (*set_state)(uint64_t _state, uint32_t _rgba); diff --git a/include/bgfx/platform.h b/include/bgfx/platform.h index 5fd84c4b4..7e59011ee 100644 --- a/include/bgfx/platform.h +++ b/include/bgfx/platform.h @@ -89,6 +89,7 @@ namespace bgfx /// /// @param[in] _handle Texture handle. /// @param[in] _ptr Native API pointer to texture. + /// @param[in] _layerIndex Layer index for texture arrays (only implemented for D3D11). /// /// @returns Native API pointer to texture. If result is 0, texture is not created yet from the /// main thread. @@ -97,7 +98,7 @@ namespace bgfx /// /// @attention C99's equivalent binding is `bgfx_override_internal_texture_ptr`. /// - uintptr_t overrideInternal(TextureHandle _handle, uintptr_t _ptr); + uintptr_t overrideInternal(TextureHandle _handle, uintptr_t _ptr, uint32_t _layerIndex = 0); /// Override internal texture by creating new texture. Previously created /// internal texture will released. diff --git a/scripts/bgfx.idl b/scripts/bgfx.idl index 9c74e034a..de869cfb4 100644 --- a/scripts/bgfx.idl +++ b/scripts/bgfx.idl @@ -2701,10 +2701,11 @@ func.getInternalData --- @warning Must be called only on render thread. --- func.overrideInternal { cname = "override_internal_texture_ptr" } - "uintptr_t" --- Native API pointer to texture. If result is 0, texture is not created - --- yet from the main thread. - .handle "TextureHandle" --- Texture handle. - .ptr "uintptr_t" --- Native API pointer to texture. + "uintptr_t" --- Native API pointer to texture. If result is 0, texture is not created + --- yet from the main thread. + .handle "TextureHandle" --- Texture handle. + .ptr "uintptr_t" --- Native API pointer to texture. + .layerIndex "uint32_t" --- Layer index for texture arrays (only implemented for D3D11). --- Override internal texture by creating new texture. Previously created --- internal texture will released. diff --git a/src/bgfx.cpp b/src/bgfx.cpp index 0bda0cc99..d7819528b 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -338,7 +338,7 @@ namespace bgfx return &g_internalData; } - uintptr_t overrideInternal(TextureHandle _handle, uintptr_t _ptr) + uintptr_t overrideInternal(TextureHandle _handle, uintptr_t _ptr, uint32_t _layerIndex) { BGFX_CHECK_RENDER_THREAD(); RendererContextI* rci = s_ctx->m_renderCtx; @@ -347,7 +347,7 @@ namespace bgfx return 0; } - rci->overrideInternal(_handle, _ptr); + rci->overrideInternal(_handle, _ptr, _layerIndex); return rci->getInternal(_handle); } diff --git a/src/bgfx.idl.inl b/src/bgfx.idl.inl index fa0e2b30e..8429f49b2 100644 --- a/src/bgfx.idl.inl +++ b/src/bgfx.idl.inl @@ -1010,10 +1010,10 @@ BGFX_C_API const bgfx_internal_data_t* bgfx_get_internal_data(void) return (const bgfx_internal_data_t*)bgfx::getInternalData(); } -BGFX_C_API uintptr_t bgfx_override_internal_texture_ptr(bgfx_texture_handle_t _handle, uintptr_t _ptr) +BGFX_C_API uintptr_t bgfx_override_internal_texture_ptr(bgfx_texture_handle_t _handle, uintptr_t _ptr, uint32_t _layerIndex) { union { bgfx_texture_handle_t c; bgfx::TextureHandle cpp; } handle = { _handle }; - return bgfx::overrideInternal(handle.cpp, _ptr); + return bgfx::overrideInternal(handle.cpp, _ptr, _layerIndex); } BGFX_C_API uintptr_t bgfx_override_internal_texture(bgfx_texture_handle_t _handle, uint16_t _width, uint16_t _height, uint8_t _numMips, bgfx_texture_format_t _format, uint64_t _flags) diff --git a/src/bgfx_p.h b/src/bgfx_p.h index 927aa64bf..73b2531a2 100644 --- a/src/bgfx_p.h +++ b/src/bgfx_p.h @@ -3097,7 +3097,7 @@ namespace bgfx virtual void updateTextureEnd() = 0; virtual void readTexture(TextureHandle _handle, void* _data, uint8_t _mip) = 0; virtual void resizeTexture(TextureHandle _handle, uint16_t _width, uint16_t _height, uint8_t _numMips, uint16_t _numLayers) = 0; - virtual void overrideInternal(TextureHandle _handle, uintptr_t _ptr) = 0; + virtual void overrideInternal(TextureHandle _handle, uintptr_t _ptr, uint32_t _layerIndex) = 0; virtual uintptr_t getInternal(TextureHandle _handle) = 0; virtual void destroyTexture(TextureHandle _handle) = 0; virtual void createFrameBuffer(FrameBufferHandle _handle, uint8_t _num, const Attachment* _attachment) = 0; diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 1d5d81df4..c92d28862 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -1903,12 +1903,12 @@ namespace bgfx { namespace d3d11 release(mem); } - void overrideInternal(TextureHandle _handle, uintptr_t _ptr) override + void overrideInternal(TextureHandle _handle, uintptr_t _ptr, uint32_t _layerIndex) override { // Resource ref. counts might be messed up outside of bgfx. // Disabling ref. count check once texture is overridden. setGraphicsDebuggerPresent(true); - m_textures[_handle.idx].overrideInternal(_ptr); + m_textures[_handle.idx].overrideInternal(_ptr, _layerIndex); } uintptr_t getInternal(TextureHandle _handle) override @@ -4741,7 +4741,7 @@ namespace bgfx { namespace d3d11 } } - void TextureD3D11::overrideInternal(uintptr_t _ptr) + void TextureD3D11::overrideInternal(uintptr_t _ptr, uint32_t layerIndex) { D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc{}; @@ -4751,6 +4751,18 @@ namespace bgfx { namespace d3d11 m_srv->GetDesc(&srvDesc); } + switch (srvDesc.ViewDimension) + { + case D3D11_SRV_DIMENSION_TEXTURE2DARRAY: + srvDesc.Texture2DArray.FirstArraySlice = layerIndex; + srvDesc.Texture2DArray.ArraySize = 1; + break; + case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY: + srvDesc.Texture2DMSArray.FirstArraySlice = layerIndex; + srvDesc.Texture2DMSArray.ArraySize = 1; + break; + } + destroy(); m_flags |= BGFX_SAMPLER_INTERNAL_SHARED; m_ptr = (ID3D11Resource*)_ptr; diff --git a/src/renderer_d3d11.h b/src/renderer_d3d11.h index cb51a1da9..67bd070f1 100644 --- a/src/renderer_d3d11.h +++ b/src/renderer_d3d11.h @@ -286,7 +286,7 @@ namespace bgfx { namespace d3d11 void* create(const Memory* _mem, uint64_t _flags, uint8_t _skip); void destroy(); - void overrideInternal(uintptr_t _ptr); + void overrideInternal(uintptr_t _ptr, uint32_t _layerIndex); void update(uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, uint16_t _pitch, const Memory* _mem); void commit(uint8_t _stage, uint32_t _flags, const float _palette[][4]); void resolve(uint8_t _resolve, uint32_t _layer, uint32_t _numLayers, uint32_t _mip) const; diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index 9d5ae3c13..713cda45f 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -2042,7 +2042,7 @@ namespace bgfx { namespace d3d12 release(mem); } - void overrideInternal(TextureHandle _handle, uintptr_t _ptr) override + void overrideInternal(TextureHandle _handle, uintptr_t _ptr, uint32_t /*_layerIndex*/) override { // Resource ref. counts might be messed up outside of bgfx. // Disabling ref. count check once texture is overridden. diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 27c354b2e..f41ca9541 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -3500,7 +3500,7 @@ namespace bgfx { namespace gl release(mem); } - void overrideInternal(TextureHandle _handle, uintptr_t _ptr) override + void overrideInternal(TextureHandle _handle, uintptr_t _ptr, uint32_t /*_layerIndex*/) override { m_textures[_handle.idx].overrideInternal(_ptr); } diff --git a/src/renderer_mtl.mm b/src/renderer_mtl.mm index 3504a7e9a..a5aa1b81d 100644 --- a/src/renderer_mtl.mm +++ b/src/renderer_mtl.mm @@ -1141,7 +1141,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames release(mem); } - void overrideInternal(TextureHandle _handle, uintptr_t _ptr) override + void overrideInternal(TextureHandle _handle, uintptr_t _ptr, uint32_t /*_layerIndex*/) override { m_textures[_handle.idx].overrideInternal(_ptr); } diff --git a/src/renderer_noop.cpp b/src/renderer_noop.cpp index 285d2f32f..5dbac3cbe 100644 --- a/src/renderer_noop.cpp +++ b/src/renderer_noop.cpp @@ -189,7 +189,7 @@ namespace bgfx { namespace noop { } - void overrideInternal(TextureHandle /*_handle*/, uintptr_t /*_ptr*/) override + void overrideInternal(TextureHandle /*_handle*/, uintptr_t /*_ptr*/, uint32_t /*_layerIndex*/) override { } diff --git a/src/renderer_vk.cpp b/src/renderer_vk.cpp index 1626f2545..8976556a7 100644 --- a/src/renderer_vk.cpp +++ b/src/renderer_vk.cpp @@ -2403,7 +2403,7 @@ VK_IMPORT_DEVICE bgfx::release(mem); } - void overrideInternal(TextureHandle /*_handle*/, uintptr_t /*_ptr*/) override + void overrideInternal(TextureHandle /*_handle*/, uintptr_t /*_ptr*/, uint32_t /*_layerIndex*/) override { }