From e10a303a6d52c947e640c489067763f50586eb74 Mon Sep 17 00:00:00 2001 From: Kation Date: Mon, 8 Apr 2024 10:44:09 +0800 Subject: [PATCH 1/2] Expose Direct3D backend --- include/c/gr_context.h | 4 ++++ include/c/sk_types.h | 25 +++++++++++++++++++++++++ src/c/gr_context.cpp | 24 ++++++++++++++++++++++++ src/c/sk_types_priv.h | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 86 insertions(+) diff --git a/include/c/gr_context.h b/include/c/gr_context.h index 234f9a1a1aa9..6735401f4403 100644 --- a/include/c/gr_context.h +++ b/include/c/gr_context.h @@ -31,6 +31,8 @@ SK_C_API gr_direct_context_t* gr_direct_context_make_vulkan(const gr_vk_backendc SK_C_API gr_direct_context_t* gr_direct_context_make_vulkan_with_options(const gr_vk_backendcontext_t vkBackendContext, const gr_context_options_t* options); SK_C_API gr_direct_context_t* gr_direct_context_make_metal(void* device, void* queue); SK_C_API gr_direct_context_t* gr_direct_context_make_metal_with_options(void* device, void* queue, const gr_context_options_t* options); +SK_C_API gr_direct_context_t* gr_direct_context_make_direct3d(const gr_d3d_backendcontext_t d3dBackendContext); +SK_C_API gr_direct_context_t* gr_direct_context_make_direct3d_with_options(const gr_d3d_backendcontext_t d3dBackendContext, const gr_context_options_t* options); // TODO: the overloads with GrContextOptions @@ -75,6 +77,7 @@ SK_C_API bool gr_vk_extensions_has_extension(gr_vk_extensions_t* extensions, con SK_C_API gr_backendtexture_t* gr_backendtexture_new_gl(int width, int height, bool mipmapped, const gr_gl_textureinfo_t* glInfo); SK_C_API gr_backendtexture_t* gr_backendtexture_new_vulkan(int width, int height, const gr_vk_imageinfo_t* vkInfo); SK_C_API gr_backendtexture_t* gr_backendtexture_new_metal(int width, int height, bool mipmapped, const gr_mtl_textureinfo_t* mtlInfo); +SK_C_API gr_backendtexture_t* gr_backendtexture_new_direct3d(int width, int height, const gr_d3d_textureinfo_t* d3dInfo); SK_C_API void gr_backendtexture_delete(gr_backendtexture_t* texture); SK_C_API bool gr_backendtexture_is_valid(const gr_backendtexture_t* texture); @@ -90,6 +93,7 @@ SK_C_API bool gr_backendtexture_get_gl_textureinfo(const gr_backendtexture_t* te SK_C_API gr_backendrendertarget_t* gr_backendrendertarget_new_gl(int width, int height, int samples, int stencils, const gr_gl_framebufferinfo_t* glInfo); SK_C_API gr_backendrendertarget_t* gr_backendrendertarget_new_vulkan(int width, int height, int samples, const gr_vk_imageinfo_t* vkImageInfo); SK_C_API gr_backendrendertarget_t* gr_backendrendertarget_new_metal(int width, int height, int samples, const gr_mtl_textureinfo_t* mtlInfo); +SK_C_API gr_backendrendertarget_t* gr_backendrendertarget_new_direct3d(int width, int height, const gr_d3d_textureinfo_t* d3dInfo); SK_C_API void gr_backendrendertarget_delete(gr_backendrendertarget_t* rendertarget); diff --git a/include/c/sk_types.h b/include/c/sk_types.h index 41e2b336df25..63dde603e59d 100644 --- a/include/c/sk_types.h +++ b/include/c/sk_types.h @@ -1101,4 +1101,29 @@ typedef struct skresources_resource_provider_t skresources_resource_provider_t; SK_C_PLUS_PLUS_END_GUARD +typedef struct d3d_dxgi_adapter_t d3d_dxgi_adapter_t; +typedef struct d3d_d12_device_t d3d_d12_device_t; +typedef struct d3d_d12_command_queue_t d3d_d12_command_queue_t; +typedef struct d3d_memory_allocator_t d3d_memory_allocator_t; +typedef struct { + d3d_dxgi_adapter_t* fAdapter; + d3d_d12_device_t* fDevice; + d3d_d12_command_queue_t* fQueue; + d3d_memory_allocator_t* fMemoryAllocator; + bool fProtectedContext; +} gr_d3d_backendcontext_t; + +typedef struct d3d_d12_resource_t d3d_d12_resource_t; +typedef struct d3d_alloc_t d3d_alloc_t; +typedef struct { + d3d_d12_resource_t* fResource; + d3d_alloc_t* fAlloc; + uint32_t fResourceState; + uint32_t fFormat; + uint32_t fSampleCount; + uint32_t fLevelCount; + unsigned int fSampleQualityPattern; + bool fProtected; +} gr_d3d_textureinfo_t; + #endif diff --git a/src/c/gr_context.cpp b/src/c/gr_context.cpp index adcaf69ee2ee..e0e3d37dbcb5 100644 --- a/src/c/gr_context.cpp +++ b/src/c/gr_context.cpp @@ -79,6 +79,22 @@ gr_direct_context_t* gr_direct_context_make_metal_with_options(void* device, voi return SK_ONLY_METAL(ToGrDirectContext(GrDirectContext::MakeMetal(device, queue, opts).release()), nullptr); } +gr_direct_context_t* gr_direct_context_make_direct3d(const gr_d3d_backendcontext_t d3dBackendContext) { + return SK_ONLY_DIRECT3D( + ToGrDirectContext( + GrDirectContext::MakeDirect3D(AsGrD3DBackendContext(&d3dBackendContext)).release()), + nullptr); +} + +gr_direct_context_t* gr_direct_context_make_direct3d_with_options(const gr_d3d_backendcontext_t d3dBackendContext, + const gr_context_options_t* options) { + SK_ONLY_DIRECT3D(GrContextOptions opts; if (options) { opts = AsGrContextOptions(options); }) + return SK_ONLY_DIRECT3D( + ToGrDirectContext(GrDirectContext::MakeDirect3D(AsGrD3DBackendContext(&d3dBackendContext), opts) + .release()), + nullptr); +} + bool gr_direct_context_is_abandoned(gr_direct_context_t* context) { return SK_ONLY_GPU(AsGrDirectContext(context)->abandoned(), true); } @@ -213,6 +229,10 @@ gr_backendtexture_t* gr_backendtexture_new_metal(int width, int height, bool mip return SK_ONLY_METAL(ToGrBackendTexture(new GrBackendTexture(width, height, (GrMipMapped)mipmapped, AsGrMtlTextureInfo(mtlInfo))), nullptr); } +gr_backendtexture_t* gr_backendtexture_new_direct3d(int width, int height, const gr_d3d_textureinfo_t* d3dInfo) { + return SK_ONLY_DIRECT3D(ToGrBackendTexture(new GrBackendTexture(width, height, *AsGrD3DTextureResourceInfo(d3dInfo))), nullptr); +} + void gr_backendtexture_delete(gr_backendtexture_t* texture) { SK_ONLY_GPU(delete AsGrBackendTexture(texture)); } @@ -256,6 +276,10 @@ gr_backendrendertarget_t* gr_backendrendertarget_new_metal(int width, int height return SK_ONLY_METAL(ToGrBackendRenderTarget(new GrBackendRenderTarget(width, height, samples, AsGrMtlTextureInfo(mtlInfo))), nullptr); } +gr_backendrendertarget_t* gr_backendrendertarget_new_direct3d(int width, int height, const gr_d3d_textureinfo_t* d3dInfo) { + return SK_ONLY_DIRECT3D(ToGrBackendRenderTarget(new GrBackendRenderTarget(width, height, *AsGrD3DTextureResourceInfo(d3dInfo))), nullptr); +} + void gr_backendrendertarget_delete(gr_backendrendertarget_t* rendertarget) { SK_ONLY_GPU(delete AsGrBackendRenderTarget(rendertarget)); } diff --git a/src/c/sk_types_priv.h b/src/c/sk_types_priv.h index 2ab313139064..4d7bafb83647 100644 --- a/src/c/sk_types_priv.h +++ b/src/c/sk_types_priv.h @@ -41,10 +41,18 @@ # else # define SK_ONLY_METAL(...) SK_SKIP_ARG(__VA_ARGS__) # endif +# if SK_DIRECT3D +# include "include/gpu/d3d/GrD3DBackendContext.h" +# include "include/gpu/d3d/GrD3DTypes.h" +# define SK_ONLY_DIRECT3D(...) SK_FIRST_ARG(__VA_ARGS__) +# else +# define SK_ONLY_DIRECT3D(...) SK_SKIP_ARG(__VA_ARGS__) +# endif #else // !SK_GANESH # define SK_ONLY_GPU(...) SK_SKIP_ARG(__VA_ARGS__) # define SK_ONLY_VULKAN(...) SK_SKIP_ARG(__VA_ARGS__) # define SK_ONLY_METAL(...) SK_SKIP_ARG(__VA_ARGS__) +# define SK_ONLY_DIRECT3D(...) SK_SKIP_ARG(__VA_ARGS__) #endif // SK_GANESH @@ -174,6 +182,8 @@ DEF_STRUCT_MAP(GrGLInterface, gr_glinterface_t, GrGLInterface) DEF_STRUCT_MAP(GrVkYcbcrConversionInfo, gr_vk_ycbcrconversioninfo_t, GrVkYcbcrConversionInfo) DEF_STRUCT_MAP(GrVkImageInfo, gr_vk_imageinfo_t, GrVkImageInfo) +DEF_STRUCT_MAP(GrD3DTextureResourceInfo, gr_d3d_textureinfo_t, GrD3DTextureResourceInfo) + #include "include/effects/SkRuntimeEffect.h" DEF_MAP(SkRuntimeEffect::Uniform, sk_runtimeeffect_uniform_t, RuntimeEffectUniform) DEF_MAP(SkRuntimeEffect::Child, sk_runtimeeffect_child_t, RuntimeEffectChild) @@ -409,6 +419,29 @@ static inline GrMtlTextureInfo AsGrMtlTextureInfo(const gr_mtl_textureinfo_t* mt #endif // SK_METAL +#if defined(SK_DIRECT3D) + +DEF_MAP(IDXGIAdapter1, d3d_dxgi_adapter_t, IDXGIAdapter1); +DEF_MAP(ID3D12Device, d3d_d12_device_t, ID3D12Device); +DEF_MAP(ID3D12CommandQueue, d3d_d12_command_queue_t, ID3D12CommandQueue); +DEF_MAP(GrD3DMemoryAllocator, d3d_memory_allocator_t, GrD3DMemoryAllocator); + +static inline GrD3DBackendContext AsGrD3DBackendContext(const gr_d3d_backendcontext_t* context) { + GrD3DBackendContext ctx; + gr_cp adapter = gr_cp(AsIDXGIAdapter1(context->fAdapter)); + ctx.fAdapter = adapter; + gr_cp device = gr_cp(AsID3D12Device(context->fDevice)); + ctx.fDevice = device; + gr_cp queue = + gr_cp(AsID3D12CommandQueue(context->fQueue)); + ctx.fQueue = queue; + ctx.fMemoryAllocator = sk_ref_sp(AsGrD3DMemoryAllocator(context->fMemoryAllocator)); + ctx.fProtectedContext = context->fProtectedContext ? GrProtected::kYes : GrProtected::kNo; + return ctx; +} + +#endif //SK_DIRECT3D + #endif // SK_GANESH #endif From c0905f81448656b5cc5981602eb6b9b92b7a3a8d Mon Sep 17 00:00:00 2001 From: Kation Date: Thu, 11 Apr 2024 22:39:25 +0800 Subject: [PATCH 2/2] optimize --- include/c/gr_context.h | 4 ++-- include/c/sk_types.h | 6 +++--- src/c/gr_context.cpp | 8 ++++---- src/c/sk_types_priv.h | 19 +++---------------- 4 files changed, 12 insertions(+), 25 deletions(-) diff --git a/include/c/gr_context.h b/include/c/gr_context.h index 6735401f4403..a37fae9653c4 100644 --- a/include/c/gr_context.h +++ b/include/c/gr_context.h @@ -77,7 +77,7 @@ SK_C_API bool gr_vk_extensions_has_extension(gr_vk_extensions_t* extensions, con SK_C_API gr_backendtexture_t* gr_backendtexture_new_gl(int width, int height, bool mipmapped, const gr_gl_textureinfo_t* glInfo); SK_C_API gr_backendtexture_t* gr_backendtexture_new_vulkan(int width, int height, const gr_vk_imageinfo_t* vkInfo); SK_C_API gr_backendtexture_t* gr_backendtexture_new_metal(int width, int height, bool mipmapped, const gr_mtl_textureinfo_t* mtlInfo); -SK_C_API gr_backendtexture_t* gr_backendtexture_new_direct3d(int width, int height, const gr_d3d_textureinfo_t* d3dInfo); +SK_C_API gr_backendtexture_t* gr_backendtexture_new_direct3d(int width, int height, const gr_d3d_textureresourceinfo_t* d3dInfo); SK_C_API void gr_backendtexture_delete(gr_backendtexture_t* texture); SK_C_API bool gr_backendtexture_is_valid(const gr_backendtexture_t* texture); @@ -93,7 +93,7 @@ SK_C_API bool gr_backendtexture_get_gl_textureinfo(const gr_backendtexture_t* te SK_C_API gr_backendrendertarget_t* gr_backendrendertarget_new_gl(int width, int height, int samples, int stencils, const gr_gl_framebufferinfo_t* glInfo); SK_C_API gr_backendrendertarget_t* gr_backendrendertarget_new_vulkan(int width, int height, int samples, const gr_vk_imageinfo_t* vkImageInfo); SK_C_API gr_backendrendertarget_t* gr_backendrendertarget_new_metal(int width, int height, int samples, const gr_mtl_textureinfo_t* mtlInfo); -SK_C_API gr_backendrendertarget_t* gr_backendrendertarget_new_direct3d(int width, int height, const gr_d3d_textureinfo_t* d3dInfo); +SK_C_API gr_backendrendertarget_t* gr_backendrendertarget_new_direct3d(int width, int height, const gr_d3d_textureresourceinfo_t* d3dInfo); SK_C_API void gr_backendrendertarget_delete(gr_backendrendertarget_t* rendertarget); diff --git a/include/c/sk_types.h b/include/c/sk_types.h index 63dde603e59d..c5a192e3d146 100644 --- a/include/c/sk_types.h +++ b/include/c/sk_types.h @@ -1104,12 +1104,12 @@ SK_C_PLUS_PLUS_END_GUARD typedef struct d3d_dxgi_adapter_t d3d_dxgi_adapter_t; typedef struct d3d_d12_device_t d3d_d12_device_t; typedef struct d3d_d12_command_queue_t d3d_d12_command_queue_t; -typedef struct d3d_memory_allocator_t d3d_memory_allocator_t; +typedef struct gr_d3d_memory_allocator_t gr_d3d_memory_allocator_t; typedef struct { d3d_dxgi_adapter_t* fAdapter; d3d_d12_device_t* fDevice; d3d_d12_command_queue_t* fQueue; - d3d_memory_allocator_t* fMemoryAllocator; + gr_d3d_memory_allocator_t* fMemoryAllocator; bool fProtectedContext; } gr_d3d_backendcontext_t; @@ -1124,6 +1124,6 @@ typedef struct { uint32_t fLevelCount; unsigned int fSampleQualityPattern; bool fProtected; -} gr_d3d_textureinfo_t; +} gr_d3d_textureresourceinfo_t; #endif diff --git a/src/c/gr_context.cpp b/src/c/gr_context.cpp index e0e3d37dbcb5..ca786df1de47 100644 --- a/src/c/gr_context.cpp +++ b/src/c/gr_context.cpp @@ -82,7 +82,7 @@ gr_direct_context_t* gr_direct_context_make_metal_with_options(void* device, voi gr_direct_context_t* gr_direct_context_make_direct3d(const gr_d3d_backendcontext_t d3dBackendContext) { return SK_ONLY_DIRECT3D( ToGrDirectContext( - GrDirectContext::MakeDirect3D(AsGrD3DBackendContext(&d3dBackendContext)).release()), + GrDirectContext::MakeDirect3D(AsGrD3DBackendContext(d3dBackendContext)).release()), nullptr); } @@ -90,7 +90,7 @@ gr_direct_context_t* gr_direct_context_make_direct3d_with_options(const gr_d3d_b const gr_context_options_t* options) { SK_ONLY_DIRECT3D(GrContextOptions opts; if (options) { opts = AsGrContextOptions(options); }) return SK_ONLY_DIRECT3D( - ToGrDirectContext(GrDirectContext::MakeDirect3D(AsGrD3DBackendContext(&d3dBackendContext), opts) + ToGrDirectContext(GrDirectContext::MakeDirect3D(AsGrD3DBackendContext(d3dBackendContext), opts) .release()), nullptr); } @@ -229,7 +229,7 @@ gr_backendtexture_t* gr_backendtexture_new_metal(int width, int height, bool mip return SK_ONLY_METAL(ToGrBackendTexture(new GrBackendTexture(width, height, (GrMipMapped)mipmapped, AsGrMtlTextureInfo(mtlInfo))), nullptr); } -gr_backendtexture_t* gr_backendtexture_new_direct3d(int width, int height, const gr_d3d_textureinfo_t* d3dInfo) { +gr_backendtexture_t* gr_backendtexture_new_direct3d(int width, int height, const gr_d3d_textureresourceinfo_t* d3dInfo) { return SK_ONLY_DIRECT3D(ToGrBackendTexture(new GrBackendTexture(width, height, *AsGrD3DTextureResourceInfo(d3dInfo))), nullptr); } @@ -276,7 +276,7 @@ gr_backendrendertarget_t* gr_backendrendertarget_new_metal(int width, int height return SK_ONLY_METAL(ToGrBackendRenderTarget(new GrBackendRenderTarget(width, height, samples, AsGrMtlTextureInfo(mtlInfo))), nullptr); } -gr_backendrendertarget_t* gr_backendrendertarget_new_direct3d(int width, int height, const gr_d3d_textureinfo_t* d3dInfo) { +gr_backendrendertarget_t* gr_backendrendertarget_new_direct3d(int width, int height, const gr_d3d_textureresourceinfo_t* d3dInfo) { return SK_ONLY_DIRECT3D(ToGrBackendRenderTarget(new GrBackendRenderTarget(width, height, *AsGrD3DTextureResourceInfo(d3dInfo))), nullptr); } diff --git a/src/c/sk_types_priv.h b/src/c/sk_types_priv.h index 4d7bafb83647..0abaa891ef5e 100644 --- a/src/c/sk_types_priv.h +++ b/src/c/sk_types_priv.h @@ -182,7 +182,8 @@ DEF_STRUCT_MAP(GrGLInterface, gr_glinterface_t, GrGLInterface) DEF_STRUCT_MAP(GrVkYcbcrConversionInfo, gr_vk_ycbcrconversioninfo_t, GrVkYcbcrConversionInfo) DEF_STRUCT_MAP(GrVkImageInfo, gr_vk_imageinfo_t, GrVkImageInfo) -DEF_STRUCT_MAP(GrD3DTextureResourceInfo, gr_d3d_textureinfo_t, GrD3DTextureResourceInfo) +DEF_STRUCT_MAP(GrD3DBackendContext, gr_d3d_backendcontext_t, GrD3DBackendContext) +DEF_STRUCT_MAP(GrD3DTextureResourceInfo, gr_d3d_textureresourceinfo_t, GrD3DTextureResourceInfo) #include "include/effects/SkRuntimeEffect.h" DEF_MAP(SkRuntimeEffect::Uniform, sk_runtimeeffect_uniform_t, RuntimeEffectUniform) @@ -424,21 +425,7 @@ static inline GrMtlTextureInfo AsGrMtlTextureInfo(const gr_mtl_textureinfo_t* mt DEF_MAP(IDXGIAdapter1, d3d_dxgi_adapter_t, IDXGIAdapter1); DEF_MAP(ID3D12Device, d3d_d12_device_t, ID3D12Device); DEF_MAP(ID3D12CommandQueue, d3d_d12_command_queue_t, ID3D12CommandQueue); -DEF_MAP(GrD3DMemoryAllocator, d3d_memory_allocator_t, GrD3DMemoryAllocator); - -static inline GrD3DBackendContext AsGrD3DBackendContext(const gr_d3d_backendcontext_t* context) { - GrD3DBackendContext ctx; - gr_cp adapter = gr_cp(AsIDXGIAdapter1(context->fAdapter)); - ctx.fAdapter = adapter; - gr_cp device = gr_cp(AsID3D12Device(context->fDevice)); - ctx.fDevice = device; - gr_cp queue = - gr_cp(AsID3D12CommandQueue(context->fQueue)); - ctx.fQueue = queue; - ctx.fMemoryAllocator = sk_ref_sp(AsGrD3DMemoryAllocator(context->fMemoryAllocator)); - ctx.fProtectedContext = context->fProtectedContext ? GrProtected::kYes : GrProtected::kNo; - return ctx; -} +DEF_MAP(GrD3DMemoryAllocator, gr_d3d_memory_allocator_t, GrD3DMemoryAllocator); #endif //SK_DIRECT3D