Ver código fonte

Add optional layerIndex argument to overrideInternal (#3477)

* Add optional layerIndex argument to overrideInternal

* Run genie idl
Gary Hsu 3 meses atrás
pai
commit
e7c2c69edb

+ 2 - 1
bindings/bf/bgfx.bf

@@ -4197,9 +4197,10 @@ public static class bgfx
 	///
 	/// <param name="_handle">Texture handle.</param>
 	/// <param name="_ptr">Native API pointer to texture.</param>
+	/// <param name="_layerIndex">Layer index for texture arrays (only implemented for D3D11).</param>
 	///
 	[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);
 	
 	/// <summary>
 	/// Override internal texture by creating new texture. Previously created

+ 2 - 1
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.

+ 2 - 1
bindings/cs/bgfx.cs

@@ -4152,9 +4152,10 @@ public static partial class bgfx
 	///
 	/// <param name="_handle">Texture handle.</param>
 	/// <param name="_ptr">Native API pointer to texture.</param>
+	/// <param name="_layerIndex">Layer index for texture arrays (only implemented for D3D11).</param>
 	///
 	[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);
 	
 	/// <summary>
 	/// Override internal texture by creating new texture. Previously created

+ 2 - 1
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

+ 4 - 3
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.
 /// <param name="_handle">Texture handle.</param>
 /// <param name="_ptr">Native API pointer to texture.</param>
-pub inline fn overrideInternalTexturePtr(_handle: TextureHandle, _ptr: usize) usize {
-    return bgfx_override_internal_texture_ptr(_handle, _ptr);
+/// <param name="_layerIndex">Layer index for texture arrays (only implemented for D3D11).</param>
+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.

+ 3 - 2
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);

+ 2 - 1
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.

+ 5 - 4
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.

+ 2 - 2
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);
 	}

+ 2 - 2
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)

+ 1 - 1
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;

+ 15 - 3
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;

+ 1 - 1
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;

+ 1 - 1
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.

+ 1 - 1
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);
 		}

+ 1 - 1
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);
 		}

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

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