From 956af61ff52b3ca48a5e3c8e148dfb6340e26fa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 16 Dec 2018 23:06:01 +0100 Subject: [PATCH 1/3] Fix ridiculous bug in thin3d.h. Only worked by accidental matchup between shader IDs.. --- ext/native/thin3d/thin3d.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/native/thin3d/thin3d.h b/ext/native/thin3d/thin3d.h index 63be93ce6834..e80fac4884ab 100644 --- a/ext/native/thin3d/thin3d.h +++ b/ext/native/thin3d/thin3d.h @@ -547,8 +547,8 @@ class DrawContext { virtual InputLayout *CreateInputLayout(const InputLayoutDesc &desc) = 0; // Note that these DO NOT AddRef so you must not ->Release presets unless you manually AddRef them. - ShaderModule *GetVshaderPreset(VertexShaderPreset preset) { return fsPresets_[preset]; } - ShaderModule *GetFshaderPreset(FragmentShaderPreset preset) { return vsPresets_[preset]; } + ShaderModule *GetVshaderPreset(VertexShaderPreset preset) { return vsPresets_[preset]; } + ShaderModule *GetFshaderPreset(FragmentShaderPreset preset) { return fsPresets_[preset]; } // Resources virtual Buffer *CreateBuffer(size_t size, uint32_t usageFlags) = 0; From a135dc15472673d3aa8fada1e5312634b4887dca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 16 Dec 2018 20:18:40 +0100 Subject: [PATCH 2/3] thin3d: Remove unused shader language support --- ext/native/thin3d/thin3d.h | 5 -- ext/native/thin3d/thin3d_d3d11.cpp | 132 +++++++++++++--------------- ext/native/thin3d/thin3d_d3d9.cpp | 2 +- ext/native/thin3d/thin3d_vulkan.cpp | 2 +- 4 files changed, 62 insertions(+), 79 deletions(-) diff --git a/ext/native/thin3d/thin3d.h b/ext/native/thin3d/thin3d.h index e80fac4884ab..4d77dc69fa90 100644 --- a/ext/native/thin3d/thin3d.h +++ b/ext/native/thin3d/thin3d.h @@ -204,13 +204,8 @@ enum class ShaderLanguage { GLSL_ES_300 = 2, GLSL_410 = 4, GLSL_VULKAN = 8, - SPIRV_VULKAN = 16, HLSL_D3D9 = 32, HLSL_D3D11 = 64, - HLSL_D3D9_BYTECODE = 128, - HLSL_D3D11_BYTECODE = 256, - METAL = 512, - METAL_BYTECODE = 1024, }; enum FormatSupport { diff --git a/ext/native/thin3d/thin3d_d3d11.cpp b/ext/native/thin3d/thin3d_d3d11.cpp index b8618ccfe154..69205d05e4a0 100644 --- a/ext/native/thin3d/thin3d_d3d11.cpp +++ b/ext/native/thin3d/thin3d_d3d11.cpp @@ -48,7 +48,7 @@ class D3D11DrawContext : public DrawContext { return deviceList_; } uint32_t GetSupportedShaderLanguages() const override { - return (uint32_t)ShaderLanguage::HLSL_D3D11 | (uint32_t)ShaderLanguage::HLSL_D3D11_BYTECODE; + return (uint32_t)ShaderLanguage::HLSL_D3D11; } uint32_t GetDataFormatSupport(DataFormat fmt) const override; @@ -806,11 +806,7 @@ class D3D11ShaderModule : public ShaderModule { }; ShaderModule *D3D11DrawContext::CreateShaderModule(ShaderStage stage, ShaderLanguage language, const uint8_t *data, size_t dataSize) { - switch (language) { - case ShaderLanguage::HLSL_D3D11: - case ShaderLanguage::HLSL_D3D11_BYTECODE: - break; - default: + if (language != ShaderLanguage::HLSL_D3D11) { ELOG("Unsupported shader language"); return nullptr; } @@ -826,77 +822,69 @@ ShaderModule *D3D11DrawContext::CreateShaderModule(ShaderStage stage, ShaderLang std::string compiled; std::string errors; - if (language == ShaderLanguage::HLSL_D3D11) { - const char *target = nullptr; - switch (stage) { - case ShaderStage::FRAGMENT: target = fragmentModel; break; - case ShaderStage::VERTEX: target = vertexModel; break; - case ShaderStage::GEOMETRY: - if (!geometryModel) - return nullptr; - target = geometryModel; - break; - case ShaderStage::COMPUTE: - case ShaderStage::CONTROL: - case ShaderStage::EVALUATION: - default: - Crash(); - break; - } - if (!target) { + const char *target = nullptr; + switch (stage) { + case ShaderStage::FRAGMENT: target = fragmentModel; break; + case ShaderStage::VERTEX: target = vertexModel; break; + case ShaderStage::GEOMETRY: + if (!geometryModel) return nullptr; - } - - ID3DBlob *compiledCode = nullptr; - ID3DBlob *errorMsgs = nullptr; - HRESULT result = ptr_D3DCompile(data, dataSize, nullptr, nullptr, nullptr, "main", target, 0, 0, &compiledCode, &errorMsgs); - if (compiledCode) { - compiled = std::string((const char *)compiledCode->GetBufferPointer(), compiledCode->GetBufferSize()); - compiledCode->Release(); - } - if (errorMsgs) { - errors = std::string((const char *)errorMsgs->GetBufferPointer(), errorMsgs->GetBufferSize()); - ELOG("Failed compiling:\n%s\n%s", data, errors.c_str()); - errorMsgs->Release(); - } + target = geometryModel; + break; + case ShaderStage::COMPUTE: + case ShaderStage::CONTROL: + case ShaderStage::EVALUATION: + default: + Crash(); + break; + } + if (!target) { + return nullptr; + } - if (result != S_OK) { - return nullptr; - } + ID3DBlob *compiledCode = nullptr; + ID3DBlob *errorMsgs = nullptr; + HRESULT result = ptr_D3DCompile(data, dataSize, nullptr, nullptr, nullptr, "main", target, 0, 0, &compiledCode, &errorMsgs); + if (compiledCode) { + compiled = std::string((const char *)compiledCode->GetBufferPointer(), compiledCode->GetBufferSize()); + compiledCode->Release(); + } + if (errorMsgs) { + errors = std::string((const char *)errorMsgs->GetBufferPointer(), errorMsgs->GetBufferSize()); + ELOG("Failed compiling:\n%s\n%s", data, errors.c_str()); + errorMsgs->Release(); + } - // OK, we can now proceed - language = ShaderLanguage::HLSL_D3D11_BYTECODE; - data = (const uint8_t *)compiled.c_str(); - dataSize = compiled.size(); + if (result != S_OK) { + return nullptr; } - if (language == ShaderLanguage::HLSL_D3D11_BYTECODE) { - // Easy! - D3D11ShaderModule *module = new D3D11ShaderModule(); - module->stage = stage; - module->byteCode_ = std::vector(data, data + dataSize); - HRESULT result = S_OK; - switch (stage) { - case ShaderStage::VERTEX: - result = device_->CreateVertexShader(data, dataSize, nullptr, &module->vs); - break; - case ShaderStage::FRAGMENT: - result = device_->CreatePixelShader(data, dataSize, nullptr, &module->ps); - break; - case ShaderStage::GEOMETRY: - result = device_->CreateGeometryShader(data, dataSize, nullptr, &module->gs); - break; - default: - ELOG("Unsupported shader stage"); - result = S_FALSE; - break; - } - if (result == S_OK) { - return module; - } else { - delete module; - return nullptr; - } + // OK, we can now proceed + data = (const uint8_t *)compiled.c_str(); + dataSize = compiled.size(); + D3D11ShaderModule *module = new D3D11ShaderModule(); + module->stage = stage; + module->byteCode_ = std::vector(data, data + dataSize); + switch (stage) { + case ShaderStage::VERTEX: + result = device_->CreateVertexShader(data, dataSize, nullptr, &module->vs); + break; + case ShaderStage::FRAGMENT: + result = device_->CreatePixelShader(data, dataSize, nullptr, &module->ps); + break; + case ShaderStage::GEOMETRY: + result = device_->CreateGeometryShader(data, dataSize, nullptr, &module->gs); + break; + default: + ELOG("Unsupported shader stage"); + result = S_FALSE; + break; + } + if (result == S_OK) { + return module; + } else { + delete module; + return nullptr; } return nullptr; } diff --git a/ext/native/thin3d/thin3d_d3d9.cpp b/ext/native/thin3d/thin3d_d3d9.cpp index 8f8396798b34..c6c22b37b717 100644 --- a/ext/native/thin3d/thin3d_d3d9.cpp +++ b/ext/native/thin3d/thin3d_d3d9.cpp @@ -465,7 +465,7 @@ class D3D9Context : public DrawContext { return caps_; } uint32_t GetSupportedShaderLanguages() const override { - return (uint32_t)ShaderLanguage::HLSL_D3D9 | (uint32_t)ShaderLanguage::HLSL_D3D9_BYTECODE; + return (uint32_t)ShaderLanguage::HLSL_D3D9; } uint32_t GetDataFormatSupport(DataFormat fmt) const override; diff --git a/ext/native/thin3d/thin3d_vulkan.cpp b/ext/native/thin3d/thin3d_vulkan.cpp index 393ddb806e2b..8e0fd5a2388e 100644 --- a/ext/native/thin3d/thin3d_vulkan.cpp +++ b/ext/native/thin3d/thin3d_vulkan.cpp @@ -353,7 +353,7 @@ class VKContext : public DrawContext { return list; } uint32_t GetSupportedShaderLanguages() const override { - return (uint32_t)ShaderLanguage::GLSL_VULKAN | (uint32_t)ShaderLanguage::SPIRV_VULKAN; + return (uint32_t)ShaderLanguage::GLSL_VULKAN; } uint32_t GetDataFormatSupport(DataFormat fmt) const override; From a73c569bf60f0e8cf413ca1c586b81b8cb345748 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 18 Dec 2018 14:30:05 +0100 Subject: [PATCH 3/3] Add check for GL_FRAGMENT_PRECISION_HIGH for GLES in stencil code. --- GPU/GLES/StencilBufferGLES.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/GPU/GLES/StencilBufferGLES.cpp b/GPU/GLES/StencilBufferGLES.cpp index 31a98bb9e320..f512b5bffa49 100644 --- a/GPU/GLES/StencilBufferGLES.cpp +++ b/GPU/GLES/StencilBufferGLES.cpp @@ -26,7 +26,11 @@ static const char *stencil_fs = R"( #ifdef GL_ES +#if GL_FRAGMENT_PRECISION_HIGH precision highp float; +#else +precision mediump float; // just hope it's enough.. +#endif #endif #if __VERSION__ >= 130 #define varying in