Make it possible to specify extensions for Vulkan in the ShaderWriter
This commit is contained in:
parent
767bf55afb
commit
3af86ec6f7
7 changed files with 18 additions and 15 deletions
|
@ -7,7 +7,6 @@
|
||||||
#include "Common/Log.h"
|
#include "Common/Log.h"
|
||||||
|
|
||||||
const char * const vulkan_glsl_preamble_fs =
|
const char * const vulkan_glsl_preamble_fs =
|
||||||
"#version 450\n"
|
|
||||||
"#extension GL_ARB_separate_shader_objects : enable\n"
|
"#extension GL_ARB_separate_shader_objects : enable\n"
|
||||||
"#extension GL_ARB_shading_language_420pack : enable\n"
|
"#extension GL_ARB_shading_language_420pack : enable\n"
|
||||||
"#extension GL_ARB_conservative_depth : enable\n"
|
"#extension GL_ARB_conservative_depth : enable\n"
|
||||||
|
@ -45,7 +44,6 @@ static const char * const hlsl_d3d9_preamble_fs =
|
||||||
"#define DISCARD_BELOW(x) clip(x)\n";
|
"#define DISCARD_BELOW(x) clip(x)\n";
|
||||||
|
|
||||||
static const char * const vulkan_glsl_preamble_vs =
|
static const char * const vulkan_glsl_preamble_vs =
|
||||||
"#version 450\n"
|
|
||||||
"#extension GL_ARB_separate_shader_objects : enable\n"
|
"#extension GL_ARB_separate_shader_objects : enable\n"
|
||||||
"#extension GL_ARB_shading_language_420pack : enable\n"
|
"#extension GL_ARB_shading_language_420pack : enable\n"
|
||||||
"#define mul(x, y) ((x) * (y))\n"
|
"#define mul(x, y) ((x) * (y))\n"
|
||||||
|
@ -69,7 +67,6 @@ static const char * const hlsl_preamble_gs =
|
||||||
"\n";
|
"\n";
|
||||||
|
|
||||||
static const char * const vulkan_glsl_preamble_gs =
|
static const char * const vulkan_glsl_preamble_gs =
|
||||||
"#version 450\n"
|
|
||||||
"#extension GL_ARB_separate_shader_objects : enable\n"
|
"#extension GL_ARB_separate_shader_objects : enable\n"
|
||||||
"#extension GL_ARB_shading_language_420pack : enable\n"
|
"#extension GL_ARB_shading_language_420pack : enable\n"
|
||||||
"#define mul(x, y) ((x) * (y))\n"
|
"#define mul(x, y) ((x) * (y))\n"
|
||||||
|
@ -113,9 +110,14 @@ ShaderWriter & ShaderWriter::F(const char *format, ...) {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShaderWriter::Preamble(const char **gl_extensions, size_t num_gl_extensions) {
|
void ShaderWriter::Preamble(Slice<const char *> extensions) {
|
||||||
switch (lang_.shaderLanguage) {
|
switch (lang_.shaderLanguage) {
|
||||||
case GLSL_VULKAN:
|
case GLSL_VULKAN:
|
||||||
|
C("#version 450\n");
|
||||||
|
// IMPORTANT! Extensions must be the first thing after #version.
|
||||||
|
for (size_t i = 0; i < extensions.size(); i++) {
|
||||||
|
F("%s\n", extensions[i]);
|
||||||
|
}
|
||||||
switch (stage_) {
|
switch (stage_) {
|
||||||
case ShaderStage::Vertex:
|
case ShaderStage::Vertex:
|
||||||
W(vulkan_glsl_preamble_vs);
|
W(vulkan_glsl_preamble_vs);
|
||||||
|
@ -154,8 +156,8 @@ void ShaderWriter::Preamble(const char **gl_extensions, size_t num_gl_extensions
|
||||||
default: // OpenGL
|
default: // OpenGL
|
||||||
F("#version %d%s\n", lang_.glslVersionNumber, lang_.gles && lang_.glslES30 ? " es" : "");
|
F("#version %d%s\n", lang_.glslVersionNumber, lang_.gles && lang_.glslES30 ? " es" : "");
|
||||||
// IMPORTANT! Extensions must be the first thing after #version.
|
// IMPORTANT! Extensions must be the first thing after #version.
|
||||||
for (size_t i = 0; i < num_gl_extensions; i++) {
|
for (size_t i = 0; i < extensions.size(); i++) {
|
||||||
F("%s\n", gl_extensions[i]);
|
F("%s\n", extensions[i]);
|
||||||
}
|
}
|
||||||
// Print some system info - useful to gather information directly from screenshots.
|
// Print some system info - useful to gather information directly from screenshots.
|
||||||
if (strlen(lang_.driverInfo) != 0) {
|
if (strlen(lang_.driverInfo) != 0) {
|
||||||
|
|
|
@ -37,8 +37,9 @@ enum FSFlags {
|
||||||
|
|
||||||
class ShaderWriter {
|
class ShaderWriter {
|
||||||
public:
|
public:
|
||||||
ShaderWriter(char *buffer, const ShaderLanguageDesc &lang, ShaderStage stage, const char **gl_extensions = nullptr, size_t num_gl_extensions = 0) : p_(buffer), lang_(lang), stage_(stage) {
|
// Extensions are supported for both OpenGL ES and Vulkan (though of course, they're different).
|
||||||
Preamble(gl_extensions, num_gl_extensions);
|
ShaderWriter(char *buffer, const ShaderLanguageDesc &lang, ShaderStage stage, Slice<const char *> extensions = Slice<const char *>()) : p_(buffer), lang_(lang), stage_(stage) {
|
||||||
|
Preamble(extensions);
|
||||||
}
|
}
|
||||||
ShaderWriter(const ShaderWriter &) = delete;
|
ShaderWriter(const ShaderWriter &) = delete;
|
||||||
|
|
||||||
|
@ -110,7 +111,7 @@ private:
|
||||||
void DeclareSampler2D(const char *name, int binding);
|
void DeclareSampler2D(const char *name, int binding);
|
||||||
void DeclareTexture2D(const char *name, int binding);
|
void DeclareTexture2D(const char *name, int binding);
|
||||||
|
|
||||||
void Preamble(const char **gl_extensions, size_t num_gl_extensions);
|
void Preamble(Slice<const char *> extensions);
|
||||||
|
|
||||||
char *p_;
|
char *p_;
|
||||||
const ShaderLanguageDesc &lang_;
|
const ShaderLanguageDesc &lang_;
|
||||||
|
|
|
@ -74,7 +74,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ShaderWriter p(buffer, compat, ShaderStage::Fragment, gl_exts.data(), gl_exts.size());
|
ShaderWriter p(buffer, compat, ShaderStage::Fragment, gl_exts);
|
||||||
|
|
||||||
bool lmode = id.Bit(FS_BIT_LMODE);
|
bool lmode = id.Bit(FS_BIT_LMODE);
|
||||||
bool doTexture = id.Bit(FS_BIT_DO_TEXTURE);
|
bool doTexture = id.Bit(FS_BIT_DO_TEXTURE);
|
||||||
|
|
|
@ -48,7 +48,7 @@ bool GenerateGeometryShader(const GShaderID &id, char *buffer, const ShaderLangu
|
||||||
bool vertexRangeCulling = !id.Bit(GS_BIT_CURVE);
|
bool vertexRangeCulling = !id.Bit(GS_BIT_CURVE);
|
||||||
bool clipClampedDepth = gstate_c.Use(GPU_USE_DEPTH_CLAMP);
|
bool clipClampedDepth = gstate_c.Use(GPU_USE_DEPTH_CLAMP);
|
||||||
|
|
||||||
ShaderWriter p(buffer, compat, ShaderStage::Geometry, gl_exts.data(), gl_exts.size());
|
ShaderWriter p(buffer, compat, ShaderStage::Geometry, gl_exts);
|
||||||
p.C("layout(triangles) in;\n");
|
p.C("layout(triangles) in;\n");
|
||||||
if (clipClampedDepth && vertexRangeCulling && !gstate_c.Use(GPU_USE_CLIP_DISTANCE)) {
|
if (clipClampedDepth && vertexRangeCulling && !gstate_c.Use(GPU_USE_CLIP_DISTANCE)) {
|
||||||
p.C("layout(triangle_strip, max_vertices = 12) out;\n");
|
p.C("layout(triangle_strip, max_vertices = 12) out;\n");
|
||||||
|
|
|
@ -84,7 +84,7 @@ static const SamplerDef samplers[1] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
void GenerateStencilFs(char *buffer, const ShaderLanguageDesc &lang, const Draw::Bugs &bugs) {
|
void GenerateStencilFs(char *buffer, const ShaderLanguageDesc &lang, const Draw::Bugs &bugs) {
|
||||||
ShaderWriter writer(buffer, lang, ShaderStage::Fragment, nullptr, 0);
|
ShaderWriter writer(buffer, lang, ShaderStage::Fragment);
|
||||||
writer.HighPrecisionFloat();
|
writer.HighPrecisionFloat();
|
||||||
writer.DeclareSamplers(samplers);
|
writer.DeclareSamplers(samplers);
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@ void GenerateStencilFs(char *buffer, const ShaderLanguageDesc &lang, const Draw:
|
||||||
|
|
||||||
// This can probably be shared with some other shaders, like reinterpret or the future depth upload.
|
// This can probably be shared with some other shaders, like reinterpret or the future depth upload.
|
||||||
void GenerateStencilVs(char *buffer, const ShaderLanguageDesc &lang) {
|
void GenerateStencilVs(char *buffer, const ShaderLanguageDesc &lang) {
|
||||||
ShaderWriter writer(buffer, lang, ShaderStage::Vertex, nullptr, 0);
|
ShaderWriter writer(buffer, lang, ShaderStage::Vertex);
|
||||||
|
|
||||||
writer.BeginVSMain(lang.vertexIndex ? Slice<InputDef>::empty() : inputs, Slice<UniformDef>::empty(), varyings);
|
writer.BeginVSMain(lang.vertexIndex ? Slice<InputDef>::empty() : inputs, Slice<UniformDef>::empty(), varyings);
|
||||||
|
|
||||||
|
|
|
@ -153,7 +153,7 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ShaderWriter p(buffer, compat, ShaderStage::Vertex, gl_exts.data(), gl_exts.size());
|
ShaderWriter p(buffer, compat, ShaderStage::Vertex, gl_exts);
|
||||||
|
|
||||||
bool isModeThrough = id.Bit(VS_BIT_IS_THROUGH);
|
bool isModeThrough = id.Bit(VS_BIT_IS_THROUGH);
|
||||||
bool lmode = id.Bit(VS_BIT_LMODE);
|
bool lmode = id.Bit(VS_BIT_LMODE);
|
||||||
|
|
|
@ -243,7 +243,7 @@ bool TestReinterpretShaders() {
|
||||||
for (int j = 0; j < 3; j++) {
|
for (int j = 0; j < 3; j++) {
|
||||||
if (i == j)
|
if (i == j)
|
||||||
continue; // useless shader!
|
continue; // useless shader!
|
||||||
ShaderWriter writer(buffer, desc, ShaderStage::Fragment, nullptr, 0);
|
ShaderWriter writer(buffer, desc, ShaderStage::Fragment);
|
||||||
GenerateReinterpretFragmentShader(writer, fmts[i], fmts[j]);
|
GenerateReinterpretFragmentShader(writer, fmts[i], fmts[j]);
|
||||||
if (strlen(buffer) >= 8192) {
|
if (strlen(buffer) >= 8192) {
|
||||||
printf("Reinterpret fragment shader %d exceeded buffer:\n\n%s\n", (int)j, LineNumberString(buffer).c_str());
|
printf("Reinterpret fragment shader %d exceeded buffer:\n\n%s\n", (int)j, LineNumberString(buffer).c_str());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue