Start using common shaders for some GL shaders

This commit is contained in:
baldurk committed 2016-07-21 23:25:01 +02:00
1 parent 28645937db
commit 96d98fa5d7
6 files changed
+122 -91

No files matched your search

+35 -55
View File
@@ -58,7 +58,12 @@ layout(binding = 8) uniform usampler2DRect texUInt2DRect;
layout(binding = 9) uniform usamplerBuffer texUIntBuffer;
layout(binding = 10) uniform usampler2DMS texUInt2DMS;
uvec4 SampleTextureUInt4(vec2 pos, int type, bool flipY, int mipLevel, float slice, int sampleIdx)
vec4 SampleTextureFloat4(int type, vec2 pos, float slice, int mipLevel, int sampleIdx, vec3 texRes)
{
return vec4(0.0f, 0.0f, 0.0f, 0.0f);
}
uvec4 SampleTextureUInt4(int type, vec2 pos, float slice, int mipLevel, int sampleIdx, vec3 texRes)
{
uvec4 col;
if(type == RESTYPE_TEX1D)
@@ -77,18 +82,12 @@ uvec4 SampleTextureUInt4(vec2 pos, int type, bool flipY, int mipLevel, float sli
{
ivec2 size = textureSize(texUInt2D, mipLevel);
if(flipY)
pos.y = size.y - pos.y;
col = texelFetch(texUInt2D, ivec2(pos), mipLevel);
}
else if(type == RESTYPE_TEXRECT)
{
ivec2 size = textureSize(texUInt2DRect);
if(flipY)
pos.y = size.y - pos.y;
col = texelFetch(texUInt2DRect, ivec2(pos));
}
else if(type == RESTYPE_TEXBUFFER)
@@ -99,9 +98,6 @@ uvec4 SampleTextureUInt4(vec2 pos, int type, bool flipY, int mipLevel, float sli
{
ivec2 size = textureSize(texUInt2DMS);
if(flipY)
pos.y = size.y - pos.y;
if(sampleIdx < 0)
sampleIdx = 0;
@@ -111,24 +107,23 @@ uvec4 SampleTextureUInt4(vec2 pos, int type, bool flipY, int mipLevel, float sli
{
ivec3 size = textureSize(texUInt2DArray, mipLevel);
if(flipY)
pos.y = size.y - pos.y;
col = texelFetch(texUInt2DArray, ivec3(pos, slice), mipLevel);
}
else // if (type == RESTYPE_TEX3D)
{
ivec3 size = textureSize(texUInt3D, mipLevel);
if(flipY)
pos.y = size.y - pos.y;
col = texelFetch(texUInt3D, ivec3(pos, slice), mipLevel);
}
return col;
}
ivec4 SampleTextureSInt4(int type, vec2 pos, float slice, int mipLevel, int sampleIdx, vec3 texRes)
{
return ivec4(0, 0, 0, 0);
}
#elif SINT_TEX
// these bindings are defined based on the RESTYPE_ defines in debuguniforms.h
@@ -144,7 +139,17 @@ layout(binding = 8) uniform isampler2DRect texSInt2DRect;
layout(binding = 9) uniform isamplerBuffer texSIntBuffer;
layout(binding = 10) uniform isampler2DMS texSInt2DMS;
ivec4 SampleTextureSInt4(vec2 pos, int type, bool flipY, int mipLevel, float slice, int sampleIdx)
vec4 SampleTextureFloat4(int type, vec2 pos, float slice, int mipLevel, int sampleIdx, vec3 texRes)
{
return vec4(0.0f, 0.0f, 0.0f, 0.0f);
}
uvec4 SampleTextureUInt4(int type, vec2 pos, float slice, int mipLevel, int sampleIdx, vec3 texRes)
{
return uvec4(0u, 0u, 0u, 0u);
}
ivec4 SampleTextureSInt4(int type, vec2 pos, float slice, int mipLevel, int sampleIdx, vec3 texRes)
{
ivec4 col;
if(type == RESTYPE_TEX1D)
@@ -163,18 +168,12 @@ ivec4 SampleTextureSInt4(vec2 pos, int type, bool flipY, int mipLevel, float sli
{
ivec2 size = textureSize(texSInt2D, mipLevel);
if(flipY)
pos.y = size.y - pos.y;
col = texelFetch(texSInt2D, ivec2(pos), mipLevel);
}
else if(type == RESTYPE_TEXRECT)
{
ivec2 size = textureSize(texSInt2DRect);
if(flipY)
pos.y = size.y - pos.y;
col = texelFetch(texSInt2DRect, ivec2(pos));
}
else if(type == RESTYPE_TEXBUFFER)
@@ -185,9 +184,6 @@ ivec4 SampleTextureSInt4(vec2 pos, int type, bool flipY, int mipLevel, float sli
{
ivec2 size = textureSize(texSInt2DMS);
if(flipY)
pos.y = size.y - pos.y;
if(sampleIdx < 0)
sampleIdx = 0;
@@ -197,18 +193,12 @@ ivec4 SampleTextureSInt4(vec2 pos, int type, bool flipY, int mipLevel, float sli
{
ivec3 size = textureSize(texSInt2DArray, mipLevel);
if(flipY)
pos.y = size.y - pos.y;
col = texelFetch(texSInt2DArray, ivec3(pos, slice), mipLevel);
}
else // if (type == RESTYPE_TEX3D)
{
ivec3 size = textureSize(texSInt3D, mipLevel);
if(flipY)
pos.y = size.y - pos.y;
col = texelFetch(texSInt3D, ivec3(pos, slice), mipLevel);
}
@@ -230,8 +220,7 @@ layout(binding = 8) uniform sampler2DRect tex2DRect;
layout(binding = 9) uniform samplerBuffer texBuffer;
layout(binding = 10) uniform sampler2DMS tex2DMS;
vec4 SampleTextureFloat4(vec2 pos, int type, bool flipY, int mipLevel, float slice, int sampleIdx,
int sampleCount)
vec4 SampleTextureFloat4(int type, vec2 pos, float slice, int mipLevel, int sampleIdx, vec3 texRes)
{
vec4 col;
if(type == RESTYPE_TEX1D)
@@ -250,18 +239,12 @@ vec4 SampleTextureFloat4(vec2 pos, int type, bool flipY, int mipLevel, float sli
{
ivec2 size = textureSize(tex2D, mipLevel);
if(flipY)
pos.y = size.y - pos.y;
col = textureLod(tex2D, pos / size, float(mipLevel));
}
else if(type == RESTYPE_TEXRECT)
{
ivec2 size = textureSize(tex2DRect);
if(flipY)
pos.y = size.y - pos.y;
col = texelFetch(tex2DRect, ivec2(pos));
}
else if(type == RESTYPE_TEXBUFFER)
@@ -272,11 +255,10 @@ vec4 SampleTextureFloat4(vec2 pos, int type, bool flipY, int mipLevel, float sli
{
ivec2 size = textureSize(tex2DMS);
if(flipY)
pos.y = size.y - pos.y;
if(sampleIdx < 0)
{
int sampleCount = -sampleIdx;
// worst resolve you've seen in your life
// it's manually unrolled because doing it as a dynamic loop on
// sampleCount seems to produce crazy artifacts on nvidia - probably a compiler bug
@@ -332,27 +314,18 @@ vec4 SampleTextureFloat4(vec2 pos, int type, bool flipY, int mipLevel, float sli
{
ivec3 size = textureSize(tex2DArray, mipLevel);
if(flipY)
pos.y = size.y - pos.y;
col = textureLod(tex2DArray, vec3(pos / size.xy, slice), float(mipLevel));
}
else if(type == RESTYPE_TEX3D)
{
ivec3 size = textureSize(tex3D, mipLevel);
if(flipY)
pos.y = size.y - pos.y;
col = textureLod(tex3D, vec3(pos / size.xy, slice / size.z), float(mipLevel));
}
else if(type == RESTYPE_TEXCUBE)
{
ivec2 size = textureSize(texCube, mipLevel);
if(flipY)
pos.y = size.y - pos.y;
vec3 cubeCoord = CalcCubeCoord(pos / size, int(slice));
col = textureLod(texCube, cubeCoord, float(mipLevel));
@@ -361,9 +334,6 @@ vec4 SampleTextureFloat4(vec2 pos, int type, bool flipY, int mipLevel, float sli
{
ivec3 size = textureSize(texCubeArray, mipLevel);
if(flipY)
pos.y = size.y - pos.y;
vec3 cubeCoord = CalcCubeCoord(pos / size.xy, int(slice) % 6);
vec4 arrayCoord = vec4(cubeCoord, int(slice) / 6);
@@ -373,4 +343,14 @@ vec4 SampleTextureFloat4(vec2 pos, int type, bool flipY, int mipLevel, float sli
return col;
}
uvec4 SampleTextureUInt4(int type, vec2 pos, float slice, int mipLevel, int sampleIdx, vec3 texRes)
{
return uvec4(0u, 0u, 0u, 0u);
}
ivec4 SampleTextureSInt4(int type, vec2 pos, float slice, int mipLevel, int sampleIdx, vec3 texRes)
{
return ivec4(0, 0, 0, 0);
}
#endif
+1 -2
View File
@@ -188,8 +188,7 @@ BINDING(0) uniform TexDisplayUBOData
float Slice;
int SampleIdx;
int NumSamples;
vec2 Padding;
vec3 Padding;
}
INST_NAME(texdisplay);
+8 -2
View File
@@ -64,7 +64,7 @@ void main(void)
vec2 scr = gl_FragCoord.xy;
#ifdef OPENGL
scr.y = OutputRes.y - scr.y;
scr.y = texdisplay.OutputRes.y - scr.y;
#endif
scr -= texdisplay.Position.xy;
@@ -90,7 +90,13 @@ void main(void)
}
}
if (texdisplay.FlipY != 0)
#ifdef VULKAN
const int defaultFlipY = 0;
#else // OPENGL
const int defaultFlipY = 1;
#endif
if (texdisplay.FlipY != defaultFlipY)
scr.y = texdisplay.TextureResolutionPS.y - scr.y;
if(uintTex)
+73 -31
View File
@@ -26,6 +26,7 @@
#include <float.h>
#include <algorithm>
#include "data/glsl/debuguniforms.h"
#include "data/glsl_shaders.h"
#include "maths/camera.h"
#include "maths/formatpacking.h"
#include "maths/matrix.h"
@@ -80,6 +81,27 @@ GLuint GLReplay::CreateCShaderProgram(const char *csSrc)
}
GLuint GLReplay::CreateShaderProgram(const char *vsSrc, const char *fsSrc, const char *gsSrc)
{
vector<string> vs;
if(vsSrc)
vs.push_back(vsSrc);
vector<string> fs;
if(fsSrc)
fs.push_back(fsSrc);
vector<string> gs;
if(gsSrc)
gs.push_back(gsSrc);
return CreateShaderProgram(vs, fs, gs);
}
GLuint GLReplay::CreateShaderProgram(const vector<string> &vs, const vector<string> &fs)
{
vector<string> empty;
return CreateShaderProgram(vs, fs, empty);
}
GLuint GLReplay::CreateShaderProgram(const vector<string> &vsSources,
const vector<string> &fsSources, const vector<string> &gsSources)
{
if(m_pDriver == NULL)
return 0;
@@ -95,10 +117,16 @@ GLuint GLReplay::CreateShaderProgram(const char *vsSrc, const char *fsSrc, const
char buffer[1024];
GLint status = 0;
if(vsSrc)
if(!vsSources.empty())
{
vs = gl.glCreateShader(eGL_VERTEX_SHADER);
gl.glShaderSource(vs, 1, &vsSrc, NULL);
vector<const char *> srcs;
srcs.reserve(vsSources.size());
for(size_t i = 0; i < vsSources.size(); i++)
srcs.push_back(vsSources[i].c_str());
gl.glShaderSource(vs, (GLsizei)srcs.size(), &srcs[0], NULL);
gl.glCompileShader(vs);
@@ -110,10 +138,16 @@ GLuint GLReplay::CreateShaderProgram(const char *vsSrc, const char *fsSrc, const
}
}
if(fsSrc)
if(!fsSources.empty())
{
fs = gl.glCreateShader(eGL_FRAGMENT_SHADER);
gl.glShaderSource(fs, 1, &fsSrc, NULL);
vector<const char *> srcs;
srcs.reserve(fsSources.size());
for(size_t i = 0; i < fsSources.size(); i++)
srcs.push_back(fsSources[i].c_str());
gl.glShaderSource(fs, (GLsizei)srcs.size(), &srcs[0], NULL);
gl.glCompileShader(fs);
@@ -125,10 +159,16 @@ GLuint GLReplay::CreateShaderProgram(const char *vsSrc, const char *fsSrc, const
}
}
if(gsSrc)
if(!gsSources.empty())
{
gs = gl.glCreateShader(eGL_GEOMETRY_SHADER);
gl.glShaderSource(gs, 1, &gsSrc, NULL);
vector<const char *> srcs;
srcs.reserve(gsSources.size());
for(size_t i = 0; i < gsSources.size(); i++)
srcs.push_back(gsSources[i].c_str());
gl.glShaderSource(gs, (GLsizei)srcs.size(), &srcs[0], NULL);
gl.glCompileShader(gs);
@@ -198,27 +238,27 @@ void GLReplay::InitDebugData()
DebugData.outWidth = 0.0f;
DebugData.outHeight = 0.0f;
string blitvsSource = GetEmbeddedResource(glsl_blit_vert);
string blitfsSource = GetEmbeddedResource(glsl_blit_frag);
vector<string> empty;
DebugData.blitProg = CreateShaderProgram(blitvsSource.c_str(), blitfsSource.c_str());
vector<string> vs;
vector<string> fs;
vector<string> gs;
string glslheader = "#version 420 core\n\n";
glslheader += GetEmbeddedResource(glsl_debuguniforms_h);
GenerateGLSLShader(vs, eShaderGLSL, "", GetEmbeddedResource(spv_blit_vert), 420);
GenerateGLSLShader(fs, eShaderGLSL, "", GetEmbeddedResource(glsl_blit_frag), 420);
string texfs = GetEmbeddedResource(glsl_texsample_h);
texfs += GetEmbeddedResource(glsl_texdisplay_frag);
DebugData.blitProg = CreateShaderProgram(vs, fs);
DebugData.texDisplayVSProg = CreateShaderProgram(blitvsSource.c_str(), NULL);
DebugData.texDisplayVSProg = CreateShaderProgram(vs, empty);
for(int i = 0; i < 3; i++)
{
string glsl = glslheader;
glsl += string("#define UINT_TEX ") + (i == 1 ? "1" : "0") + "\n";
glsl += string("#define SINT_TEX ") + (i == 2 ? "1" : "0") + "\n";
glsl += texfs;
string defines = string("#define UINT_TEX ") + (i == 1 ? "1" : "0") + "\n";
defines += string("#define SINT_TEX ") + (i == 2 ? "1" : "0") + "\n";
DebugData.texDisplayProg[i] = CreateShaderProgram(NULL, glsl.c_str());
GenerateGLSLShader(fs, eShaderGLSL, defines, GetEmbeddedResource(spv_texdisplay_frag), 420);
DebugData.texDisplayProg[i] = CreateShaderProgram(empty, fs);
}
GLint numsl = 0;
@@ -240,6 +280,9 @@ void GLReplay::InitDebugData()
break;
}
string blitvsSource =
"#version 420 core\n#define VERTEX_ID gl_VertexID" + GetEmbeddedResource(spv_blit_vert);
if(support450)
{
DebugData.quadoverdraw420 = false;
@@ -285,7 +328,7 @@ void GLReplay::InitDebugData()
string meshvs = GetEmbeddedResource(glsl_mesh_vert);
string meshgs = GetEmbeddedResource(glsl_mesh_geom);
string meshfs = GetEmbeddedResource(glsl_mesh_frag);
meshfs = glslheader + meshfs;
meshfs = "#version 420 core\n\n" + GetEmbeddedResource(glsl_debuguniforms_h) + meshfs;
DebugData.meshProg = CreateShaderProgram(meshvs.c_str(), meshfs.c_str());
DebugData.meshgsProg = CreateShaderProgram(meshvs.c_str(), meshfs.c_str(), meshgs.c_str());
@@ -366,9 +409,6 @@ void GLReplay::InitDebugData()
// histogram/minmax data
{
string histogramglsl = GetEmbeddedResource(glsl_texsample_h);
histogramglsl += GetEmbeddedResource(glsl_histogram_comp);
RDCEraseEl(DebugData.minmaxTileProgram);
RDCEraseEl(DebugData.histogramProgram);
RDCEraseEl(DebugData.minmaxResultProgram);
@@ -377,6 +417,12 @@ void GLReplay::InitDebugData()
ARRAY_COUNT(DebugData.minmaxTileProgram) >= (TEXDISPLAY_SINT_TEX | TEXDISPLAY_TYPEMASK) + 1,
"not enough programs");
string glslheader =
"#version 420 core\n\n#extension GL_ARB_compute_shader : require\n#extension "
"GL_ARB_shader_storage_buffer_object : require\n";
glslheader += GetEmbeddedResource(spv_debuguniforms_h);
glslheader += GetEmbeddedResource(glsl_texsample_h);
for(int t = 1; t <= RESTYPE_TEXTYPEMAX; t++)
{
// float, uint, sint
@@ -393,8 +439,7 @@ void GLReplay::InitDebugData()
glsl += string("#define SHADER_RESTYPE ") + ToStr::Get(t) + "\n";
glsl += string("#define UINT_TEX ") + (i == 1 ? "1" : "0") + "\n";
glsl += string("#define SINT_TEX ") + (i == 2 ? "1" : "0") + "\n";
glsl += string("#define RENDERDOC_TileMinMaxCS 1\n");
glsl += histogramglsl;
glsl += GetEmbeddedResource(spv_minmaxtile_comp);
DebugData.minmaxTileProgram[idx] = CreateCShaderProgram(glsl.c_str());
}
@@ -404,8 +449,7 @@ void GLReplay::InitDebugData()
glsl += string("#define SHADER_RESTYPE ") + ToStr::Get(t) + "\n";
glsl += string("#define UINT_TEX ") + (i == 1 ? "1" : "0") + "\n";
glsl += string("#define SINT_TEX ") + (i == 2 ? "1" : "0") + "\n";
glsl += string("#define RENDERDOC_HistogramCS 1\n");
glsl += histogramglsl;
glsl += GetEmbeddedResource(spv_histogram_comp);
DebugData.histogramProgram[idx] = CreateCShaderProgram(glsl.c_str());
}
@@ -416,8 +460,7 @@ void GLReplay::InitDebugData()
glsl += string("#define SHADER_RESTYPE ") + ToStr::Get(t) + "\n";
glsl += string("#define UINT_TEX ") + (i == 1 ? "1" : "0") + "\n";
glsl += string("#define SINT_TEX ") + (i == 2 ? "1" : "0") + "\n";
glsl += string("#define RENDERDOC_ResultMinMaxCS 1\n");
glsl += histogramglsl;
glsl += GetEmbeddedResource(spv_minmaxresult_comp);
DebugData.minmaxResultProgram[i] = CreateCShaderProgram(glsl.c_str());
}
@@ -1613,12 +1656,11 @@ bool GLReplay::RenderTextureInternal(TextureDisplay cfg, bool blendAlpha)
ubo->OutputRes.x = DebugData.outWidth;
ubo->OutputRes.y = DebugData.outHeight;
ubo->NumSamples = texDetails.samples;
ubo->SampleIdx = (int)RDCCLAMP(cfg.sampleIdx, 0U, (uint32_t)texDetails.samples - 1);
// hacky resolve
if(cfg.sampleIdx == ~0U)
ubo->SampleIdx = -1;
ubo->SampleIdx = -texDetails.samples;
gl.glUnmapBuffer(eGL_UNIFORM_BUFFER);
+5
View File
@@ -367,6 +367,11 @@ private:
void FillTimers(CounterContext &ctx, const DrawcallTreeNode &drawnode);
GLuint CreateShaderProgram(const vector<string> &vs, const vector<string> &fs,
const vector<string> &gs);
GLuint CreateShaderProgram(const vector<string> &vs, const vector<string> &fs);
GLuint CreateCShaderProgram(const vector<string> &cs);
GLuint CreateShaderProgram(const char *vs, const char *fs, const char *gs = NULL);
GLuint CreateCShaderProgram(const char *cs);
-1
View File
@@ -1223,7 +1223,6 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn
data->Scale = cfg.scale * mipScale;
data->NumSamples = iminfo.samples;
data->SampleIdx = cfg.sampleIdx;
if(cfg.sampleIdx == ~0U)