Make it possible to specify extensions for Vulkan in the ShaderWriter

This commit is contained in:
Henrik Rydgård 2022-10-22 17:41:42 +02:00
parent 767bf55afb
commit 3af86ec6f7
7 changed files with 18 additions and 15 deletions

View file

@ -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) {

View file

@ -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_;

View file

@ -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);

View file

@ -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");

View file

@ -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);

View file

@ -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);

View file

@ -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());