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
{
}