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"
|
||||
|
||||
const char * const vulkan_glsl_preamble_fs =
|
||||
"#version 450\n"
|
||||
"#extension GL_ARB_separate_shader_objects : enable\n"
|
||||
"#extension GL_ARB_shading_language_420pack : 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";
|
||||
|
||||
static const char * const vulkan_glsl_preamble_vs =
|
||||
"#version 450\n"
|
||||
"#extension GL_ARB_separate_shader_objects : enable\n"
|
||||
"#extension GL_ARB_shading_language_420pack : enable\n"
|
||||
"#define mul(x, y) ((x) * (y))\n"
|
||||
|
@ -69,7 +67,6 @@ static const char * const hlsl_preamble_gs =
|
|||
"\n";
|
||||
|
||||
static const char * const vulkan_glsl_preamble_gs =
|
||||
"#version 450\n"
|
||||
"#extension GL_ARB_separate_shader_objects : enable\n"
|
||||
"#extension GL_ARB_shading_language_420pack : enable\n"
|
||||
"#define mul(x, y) ((x) * (y))\n"
|
||||
|
@ -113,9 +110,14 @@ ShaderWriter & ShaderWriter::F(const char *format, ...) {
|
|||
return *this;
|
||||
}
|
||||
|
||||
void ShaderWriter::Preamble(const char **gl_extensions, size_t num_gl_extensions) {
|
||||
void ShaderWriter::Preamble(Slice<const char *> extensions) {
|
||||
switch (lang_.shaderLanguage) {
|
||||
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_) {
|
||||
case ShaderStage::Vertex:
|
||||
W(vulkan_glsl_preamble_vs);
|
||||
|
@ -154,8 +156,8 @@ void ShaderWriter::Preamble(const char **gl_extensions, size_t num_gl_extensions
|
|||
default: // OpenGL
|
||||
F("#version %d%s\n", lang_.glslVersionNumber, lang_.gles && lang_.glslES30 ? " es" : "");
|
||||
// IMPORTANT! Extensions must be the first thing after #version.
|
||||
for (size_t i = 0; i < num_gl_extensions; i++) {
|
||||
F("%s\n", gl_extensions[i]);
|
||||
for (size_t i = 0; i < extensions.size(); i++) {
|
||||
F("%s\n", extensions[i]);
|
||||
}
|
||||
// Print some system info - useful to gather information directly from screenshots.
|
||||
if (strlen(lang_.driverInfo) != 0) {
|
||||
|
|
|
@ -37,8 +37,9 @@ enum FSFlags {
|
|||
|
||||
class ShaderWriter {
|
||||
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) {
|
||||
Preamble(gl_extensions, num_gl_extensions);
|
||||
// Extensions are supported for both OpenGL ES and Vulkan (though of course, they're different).
|
||||
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;
|
||||
|
||||
|
@ -110,7 +111,7 @@ private:
|
|||
void DeclareSampler2D(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_;
|
||||
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 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 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");
|
||||
if (clipClampedDepth && vertexRangeCulling && !gstate_c.Use(GPU_USE_CLIP_DISTANCE)) {
|
||||
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) {
|
||||
ShaderWriter writer(buffer, lang, ShaderStage::Fragment, nullptr, 0);
|
||||
ShaderWriter writer(buffer, lang, ShaderStage::Fragment);
|
||||
writer.HighPrecisionFloat();
|
||||
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.
|
||||
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);
|
||||
|
||||
|
|
|
@ -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 lmode = id.Bit(VS_BIT_LMODE);
|
||||
|
|
|
@ -243,7 +243,7 @@ bool TestReinterpretShaders() {
|
|||
for (int j = 0; j < 3; j++) {
|
||||
if (i == j)
|
||||
continue; // useless shader!
|
||||
ShaderWriter writer(buffer, desc, ShaderStage::Fragment, nullptr, 0);
|
||||
ShaderWriter writer(buffer, desc, ShaderStage::Fragment);
|
||||
GenerateReinterpretFragmentShader(writer, fmts[i], fmts[j]);
|
||||
if (strlen(buffer) >= 8192) {
|
||||
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