Skip to content

Commit

Permalink
Merge pull request #11678 from hrydgard/thin3d-shader-cleanups
Browse files Browse the repository at this point in the history
Thin3d shader cleanups
  • Loading branch information
unknownbrackets committed Dec 18, 2018
2 parents 791d66d + a73c569 commit daad969
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 81 deletions.
4 changes: 4 additions & 0 deletions GPU/GLES/StencilBufferGLES.cpp
Expand Up @@ -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
Expand Down
9 changes: 2 additions & 7 deletions ext/native/thin3d/thin3d.h
Expand Up @@ -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 {
Expand Down Expand Up @@ -547,8 +542,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;
Expand Down
132 changes: 60 additions & 72 deletions ext/native/thin3d/thin3d_d3d11.cpp
Expand Up @@ -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;

Expand Down Expand Up @@ -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;
}
Expand All @@ -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<uint8_t>(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<uint8_t>(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;
}
Expand Down
2 changes: 1 addition & 1 deletion ext/native/thin3d/thin3d_d3d9.cpp
Expand Up @@ -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;

Expand Down
2 changes: 1 addition & 1 deletion ext/native/thin3d/thin3d_vulkan.cpp
Expand Up @@ -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;

Expand Down

0 comments on commit daad969

Please sign in to comment.