From 5d6097d33cd924fdf5feae9748a1b5bb8e4ca315 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 19 Jan 2017 12:16:36 +0700 Subject: [PATCH] Add infrastructure for checking for supported DataFormats --- android/ab.cmd | 2 +- ext/native/thin3d/thin3d.h | 12 +++++++++- ext/native/thin3d/thin3d_d3d11.cpp | 35 +++++++++++++++++++++++++++-- ext/native/thin3d/thin3d_d3d9.cpp | 31 +++++++++++++++++++++++++ ext/native/thin3d/thin3d_gl.cpp | 31 +++++++++++++++++++++++++ ext/native/thin3d/thin3d_vulkan.cpp | 32 ++++++++++++++++++++++++++ 6 files changed, 139 insertions(+), 4 deletions(-) diff --git a/android/ab.cmd b/android/ab.cmd index deeceba0e2..119bd523ed 100644 --- a/android/ab.cmd +++ b/android/ab.cmd @@ -4,6 +4,6 @@ xcopy ..\assets\shaders assets\shaders /s /y GetFeatureList() const { return std::vector(); } virtual uint32_t GetSupportedShaderLanguages() const = 0; diff --git a/ext/native/thin3d/thin3d_d3d11.cpp b/ext/native/thin3d/thin3d_d3d11.cpp index a9f34d96e8..d7b263431f 100644 --- a/ext/native/thin3d/thin3d_d3d11.cpp +++ b/ext/native/thin3d/thin3d_d3d11.cpp @@ -28,6 +28,7 @@ public: uint32_t GetSupportedShaderLanguages() const override { return (uint32_t)ShaderLanguage::HLSL_D3D11 | (uint32_t)ShaderLanguage::HLSL_D3D11_BYTECODE; } + uint32_t GetDataFormatSupport(DataFormat fmt) const override; InputLayout *CreateInputLayout(const InputLayoutDesc &desc) override; DepthStencilState *CreateDepthStencilState(const DepthStencilStateDesc &desc) override; @@ -360,8 +361,6 @@ class D3D11Texture : public Texture { public: D3D11Texture() {} void SetImageData(int x, int y, int z, int width, int height, int depth, int level, int stride, const uint8_t *data) override; - void AutoGenMipmaps() override {} - void Finalize() override {} }; Texture *D3D11DrawContext::CreateTexture(const TextureDesc &desc) { @@ -477,6 +476,38 @@ void D3D11DrawContext::DrawUP(const void *vdata, int vertexCount) { ApplyCurrentState(); } + +uint32_t D3D11DrawContext::GetDataFormatSupport(DataFormat fmt) const { + // TODO: Actually do proper checks + switch (fmt) { + case DataFormat::B8G8R8A8_UNORM: + return FMT_RENDERTARGET | FMT_TEXTURE; + case DataFormat::B4G4R4A4_UNORM: + case DataFormat::R4G4B4A4_UNORM: + return 0; + case DataFormat::A4B4G4R4_UNORM: + return FMT_RENDERTARGET | FMT_TEXTURE; // native support + + case DataFormat::R8G8B8A8_UNORM: + return FMT_RENDERTARGET | FMT_TEXTURE | FMT_INPUTLAYOUT; + + case DataFormat::R32_FLOAT: + case DataFormat::R32G32_FLOAT: + case DataFormat::R32G32B32_FLOAT: + case DataFormat::R32G32B32A32_FLOAT: + return FMT_INPUTLAYOUT; + + case DataFormat::R8_UNORM: + return 0; + case DataFormat::BC1_RGBA_UNORM_BLOCK: + case DataFormat::BC2_UNORM_BLOCK: + case DataFormat::BC3_UNORM_BLOCK: + return FMT_TEXTURE; + default: + return 0; + } +} + #endif DrawContext *T3DCreateD3D11Context(ID3D11Device *device, ID3D11DeviceContext *context) { diff --git a/ext/native/thin3d/thin3d_d3d9.cpp b/ext/native/thin3d/thin3d_d3d9.cpp index 14b02ff37e..f84fb540cb 100644 --- a/ext/native/thin3d/thin3d_d3d9.cpp +++ b/ext/native/thin3d/thin3d_d3d9.cpp @@ -518,6 +518,7 @@ public: uint32_t GetSupportedShaderLanguages() const override { return (uint32_t)ShaderLanguage::HLSL_D3D9 | (uint32_t)ShaderLanguage::HLSL_D3D9_BYTECODE; } + uint32_t GetDataFormatSupport(DataFormat fmt) const override; ShaderModule *CreateShaderModule(ShaderStage stage, ShaderLanguage language, const uint8_t *data, size_t dataSize) override; DepthStencilState *CreateDepthStencilState(const DepthStencilStateDesc &desc) override; @@ -937,4 +938,34 @@ DrawContext *T3DCreateDX9Context(IDirect3D9 *d3d, IDirect3D9Ex *d3dEx, int adapt return new D3D9Context(d3d, d3dEx, adapterId, device, deviceEx); } +// Only partial implementation! +uint32_t D3D9Context::GetDataFormatSupport(DataFormat fmt) const { + switch (fmt) { + case DataFormat::B8G8R8A8_UNORM: + case DataFormat::B4G4R4A4_UNORM: // native support + return FMT_RENDERTARGET | FMT_TEXTURE; + case DataFormat::A4B4G4R4_UNORM: + return FMT_TEXTURE; // emulated support + + case DataFormat::R8G8B8A8_UNORM: + return FMT_RENDERTARGET | FMT_TEXTURE | FMT_INPUTLAYOUT; + + case DataFormat::R32_FLOAT: + case DataFormat::R32G32_FLOAT: + case DataFormat::R32G32B32_FLOAT: + case DataFormat::R32G32B32A32_FLOAT: + return FMT_INPUTLAYOUT; + + case DataFormat::R8_UNORM: + return 0; + case DataFormat::BC1_RGBA_UNORM_BLOCK: + case DataFormat::BC2_UNORM_BLOCK: + case DataFormat::BC3_UNORM_BLOCK: + return FMT_TEXTURE; + default: + return 0; + } +} + + } // namespace Draw \ No newline at end of file diff --git a/ext/native/thin3d/thin3d_gl.cpp b/ext/native/thin3d/thin3d_gl.cpp index 4a462deb5f..f9b0de562a 100644 --- a/ext/native/thin3d/thin3d_gl.cpp +++ b/ext/native/thin3d/thin3d_gl.cpp @@ -503,6 +503,7 @@ public: return (uint32_t)ShaderLanguage::GLSL_ES_200 | (uint32_t)ShaderLanguage::GLSL_410; #endif } + uint32_t GetDataFormatSupport(DataFormat fmt) const override; DepthStencilState *CreateDepthStencilState(const DepthStencilStateDesc &desc) override; BlendState *CreateBlendState(const BlendStateDesc &desc) override; @@ -1151,4 +1152,34 @@ void OpenGLInputLayout::Unapply() { } } +uint32_t OpenGLContext::GetDataFormatSupport(DataFormat fmt) const { + switch (fmt) { + case DataFormat::B8G8R8A8_UNORM: + return FMT_RENDERTARGET | FMT_TEXTURE; + case DataFormat::B4G4R4A4_UNORM: + case DataFormat::R4G4B4A4_UNORM: + return 0; + case DataFormat::A4B4G4R4_UNORM: + return FMT_RENDERTARGET | FMT_TEXTURE; // native support + + case DataFormat::R8G8B8A8_UNORM: + return FMT_RENDERTARGET | FMT_TEXTURE | FMT_INPUTLAYOUT; + + case DataFormat::R32_FLOAT: + case DataFormat::R32G32_FLOAT: + case DataFormat::R32G32B32_FLOAT: + case DataFormat::R32G32B32A32_FLOAT: + return FMT_INPUTLAYOUT; + + case DataFormat::R8_UNORM: + return 0; + case DataFormat::BC1_RGBA_UNORM_BLOCK: + case DataFormat::BC2_UNORM_BLOCK: + case DataFormat::BC3_UNORM_BLOCK: + return FMT_TEXTURE; + default: + return 0; + } +} + } // namespace Draw \ No newline at end of file diff --git a/ext/native/thin3d/thin3d_vulkan.cpp b/ext/native/thin3d/thin3d_vulkan.cpp index ef5bc78230..e244dd9e61 100644 --- a/ext/native/thin3d/thin3d_vulkan.cpp +++ b/ext/native/thin3d/thin3d_vulkan.cpp @@ -354,6 +354,7 @@ public: uint32_t GetSupportedShaderLanguages() const override { return (uint32_t)ShaderLanguage::GLSL_VULKAN | (uint32_t)ShaderLanguage::SPIRV_VULKAN; } + uint32_t GetDataFormatSupport(DataFormat fmt) const override; DepthStencilState *CreateDepthStencilState(const DepthStencilStateDesc &desc) override; BlendState *CreateBlendState(const BlendStateDesc &desc) override; @@ -1200,4 +1201,35 @@ std::vector VKContext::GetFeatureList() const { return features; } +uint32_t VKContext::GetDataFormatSupport(DataFormat fmt) const { + // TODO: Actually do proper checks + switch (fmt) { + case DataFormat::B8G8R8A8_UNORM: + return FMT_RENDERTARGET | FMT_TEXTURE; + case DataFormat::B4G4R4A4_UNORM: + case DataFormat::R4G4B4A4_UNORM: + return 0; + case DataFormat::A4B4G4R4_UNORM: + return FMT_RENDERTARGET | FMT_TEXTURE; // native support + + case DataFormat::R8G8B8A8_UNORM: + return FMT_RENDERTARGET | FMT_TEXTURE | FMT_INPUTLAYOUT; + + case DataFormat::R32_FLOAT: + case DataFormat::R32G32_FLOAT: + case DataFormat::R32G32B32_FLOAT: + case DataFormat::R32G32B32A32_FLOAT: + return FMT_INPUTLAYOUT; + + case DataFormat::R8_UNORM: + return 0; + case DataFormat::BC1_RGBA_UNORM_BLOCK: + case DataFormat::BC2_UNORM_BLOCK: + case DataFormat::BC3_UNORM_BLOCK: + return FMT_TEXTURE; + default: + return 0; + } +} + } // namespace Draw \ No newline at end of file