Modify shaders to be GLES compatible.

This commit is contained in:
Janos Pantos
2017-02-23 17:58:39 +01:00
committed by baldurk
parent 7796863b00
commit 46a12525ef
28 changed files with 513 additions and 111 deletions
+2
View File
@@ -96,6 +96,7 @@ set(sources
data/glsl/debuguniforms.h
data/glsl/vk_texsample.h
data/glsl/gl_texsample.h
data/glsl/gles_texsample.h
data/glsl_shaders.cpp
data/glsl_shaders.h
hooks/hooks.cpp
@@ -227,6 +228,7 @@ set(data
data/glsl/quadwrite.frag
data/glsl/texdisplay.frag
data/glsl/gl_texsample.h
data/glsl/gles_texsample.h
data/glsl/vk_texsample.h
data/glsl/text.frag
data/glsl/text.vert
+1
View File
@@ -55,5 +55,6 @@ DECLARE_EMBED(glsl_array2ms_comp);
DECLARE_EMBED(glsl_ms2array_comp);
DECLARE_EMBED(glsl_deptharr2ms_frag);
DECLARE_EMBED(glsl_depthms2arr_frag);
DECLARE_EMBED(glsl_gles_texsample_h);
#undef DECLARE_EMBED
+2 -2
View File
@@ -22,7 +22,7 @@
* THE SOFTWARE.
******************************************************************************/
//#extension GL_ARB_compute_shader : require
//#extension_nongles GL_ARB_compute_shader : require
layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -66,4 +66,4 @@ void main()
uvec4 data = texelFetch(srcArray, ivec3(int(id.x), int(id.y), int(id.z)), 0);
imageStore(dstMS, ivec3(int(id.x), int(id.y), slice), sampleIdx, data);
}
}
+2
View File
@@ -22,11 +22,13 @@
* THE SOFTWARE.
******************************************************************************/
#ifndef OPENGL_ES
out gl_PerVertex
{
vec4 gl_Position;
float gl_PointSize;
};
#endif
layout (location = 0) out vec2 uv;
+3 -3
View File
@@ -32,11 +32,11 @@ layout (binding = 0, std140) uniform checkeruniforms
void main(void)
{
vec2 ab = mod(gl_FragCoord.xy, 128.0f.xx);
vec2 ab = mod(gl_FragCoord.xy, vec2(128.0f));
if(
(ab.x < 64 && ab.y < 64) ||
(ab.x > 64 && ab.y > 64)
(ab.x < 64.0f && ab.y < 64.0f) ||
(ab.x > 64.0f && ab.y > 64.0f)
)
{
color_out = vec4(checker.darkCol.rgb*checker.darkCol.rgb, 1);
+52 -18
View File
@@ -26,9 +26,11 @@
// classes that represent a whole cbuffer
#if defined(__cplusplus)
#include "common/common.h"
#include "maths/matrix.h"
#include "maths/vec.h"
// The Android GL ES shader compiler does not supports the " character.
// The includes should be before this file is included!
//#include "common/common.h"
//#include "maths/matrix.h"
//#include "maths/vec.h"
#define uniform struct
#define vec2 Vec2f
@@ -48,23 +50,19 @@ struct Vec4u
#define uvec4 Vec4u
#if !defined(VULKAN) && !defined(OPENGL)
#error "Must define VULKAN or OPENGL before including debuguniforms.h"
#error Must define VULKAN or OPENGL before including debuguniforms.h
#endif
#if defined(VULKAN) && defined(OPENGL)
#error "Only one of VULKAN and OPENGL must be defined in debuguniforms.h"
#error Only one of VULKAN and OPENGL must be defined in debuguniforms.h
#endif
#else
// this has to happen above even any pre-processor definitions,
// so it's added in code
//#version 430 core
// we require these extensions to be able to set explicit layout bindings, etc
//#extension GL_ARB_shading_language_420pack : require
//#extension GL_ARB_separate_shader_objects : require
//#extension GL_ARB_explicit_attrib_location : require
//#extension_nongles GL_ARB_shading_language_420pack : require
//#extension_nongles GL_ARB_separate_shader_objects : require
//#extension_nongles GL_ARB_explicit_attrib_location : require
#ifdef VULKAN
@@ -76,6 +74,10 @@ struct Vec4u
#define OPENGL 1
#ifdef GL_ES
#define OPENGL_ES 1
#endif
#define BINDING(b) layout(binding = b, std140)
#define VERTEX_ID gl_VertexID
#define INSTANCE_ID gl_InstanceID
@@ -84,6 +86,13 @@ struct Vec4u
#define INST_NAME(name) name
#ifndef OPENGL_ES
#define PRECISION
#else
#define PRECISION mediump
precision PRECISION float;
#endif
#endif
BINDING(2) uniform HistogramUBOData
@@ -269,9 +278,34 @@ INST_NAME(texdisplay);
#define HGRAM_NUM_BUCKETS 256u
#define MESH_OTHER 0 // this covers points and lines, logic is the same
#define MESH_TRIANGLE_LIST 1
#define MESH_TRIANGLE_STRIP 2
#define MESH_TRIANGLE_FAN 3
#define MESH_TRIANGLE_LIST_ADJ 4
#define MESH_TRIANGLE_STRIP_ADJ 5
#define MESH_OTHER 0u // this covers points and lines, logic is the same
#define MESH_TRIANGLE_LIST 1u
#define MESH_TRIANGLE_STRIP 2u
#define MESH_TRIANGLE_FAN 3u
#define MESH_TRIANGLE_LIST_ADJ 4u
#define MESH_TRIANGLE_STRIP_ADJ 5u
#if !defined(__cplusplus)
vec3 CalcCubeCoord(vec2 uv, int face)
{
// From table 8.19 in GL4.5 spec
// Map UVs to [-0.5, 0.5] and rotate
uv -= vec2(0.5);
vec3 coord;
if(face == CUBEMAP_FACE_POS_X)
coord = vec3(0.5, -uv.y, -uv.x);
else if(face == CUBEMAP_FACE_NEG_X)
coord = vec3(-0.5, -uv.y, uv.x);
else if(face == CUBEMAP_FACE_POS_Y)
coord = vec3(uv.x, 0.5, uv.y);
else if(face == CUBEMAP_FACE_NEG_Y)
coord = vec3(uv.x, -0.5, -uv.y);
else if(face == CUBEMAP_FACE_POS_Z)
coord = vec3(uv.x, -uv.y, 0.5);
else // face == CUBEMAP_FACE_NEG_Z
coord = vec3(-uv.x, -uv.y, -0.5);
return coord;
}
#endif
-21
View File
@@ -22,27 +22,6 @@
* THE SOFTWARE.
******************************************************************************/
vec3 CalcCubeCoord(vec2 uv, int face)
{
// From table 8.19 in GL4.5 spec
// Map UVs to [-0.5, 0.5] and rotate
uv -= vec2(0.5);
vec3 coord;
if(face == CUBEMAP_FACE_POS_X)
coord = vec3(0.5, -uv.y, -uv.x);
else if(face == CUBEMAP_FACE_NEG_X)
coord = vec3(-0.5, -uv.y, uv.x);
else if(face == CUBEMAP_FACE_POS_Y)
coord = vec3(uv.x, 0.5, uv.y);
else if(face == CUBEMAP_FACE_NEG_Y)
coord = vec3(uv.x, -0.5, -uv.y);
else if(face == CUBEMAP_FACE_POS_Z)
coord = vec3(uv.x, -uv.y, 0.5);
else // face == CUBEMAP_FACE_NEG_Z
coord = vec3(-uv.x, -uv.y, -0.5);
return coord;
}
// enable these extensions if possible
//#extension GL_ARB_texture_cube_map_array : enable
//#extension GL_ARB_texture_multisample : enable
+294
View File
@@ -0,0 +1,294 @@
/******************************************************************************
* The MIT License (MIT)
*
* Copyright (c) 2014-2017 Baldur Karlsson
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
******************************************************************************/
// enable these extensions if possible
//#extension GL_OES_texture_cube_map_array : enable
//#extension GL_EXT_texture_cube_map_array : enable
#if __VERSION__ >= 310
#define GLES_texture_multisample 1
#endif
#if defined(GL_OES_texture_cube_map_array) || defined(GL_EXT_texture_cube_map_array)
#define GLES_texture_cube_map_array 1
#endif
#if UINT_TEX
// these bindings are defined based on the RESTYPE_ defines in debuguniforms.h
// 1d = 1
layout(binding = 2) uniform PRECISION usampler2D texUInt2D;
layout(binding = 3) uniform PRECISION usampler3D texUInt3D;
// cube = 4
// 1d array = 5
layout(binding = 6) uniform PRECISION usampler2DArray texUInt2DArray;
// cube array = 7
// 2d rect = 8
layout(binding = 9) uniform PRECISION usamplerBuffer texUIntBuffer;
#ifdef GLES_texture_multisample
layout(binding = 10) uniform PRECISION usampler2DMS texUInt2DMS;
#endif
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_TEX2D)
{
col = texelFetch(texUInt2D, ivec2(pos * texRes.xy), mipLevel);
}
else if(type == RESTYPE_TEXBUFFER)
{
col = texelFetch(texUIntBuffer, int(pos.x * texRes.x));
}
else if(type == RESTYPE_TEX2DMS)
{
#ifdef GLES_texture_multisample
if(sampleIdx < 0)
sampleIdx = 0;
col = texelFetch(texUInt2DMS, ivec2(pos * texRes.xy), sampleIdx);
#else
col = uvec4(0u, 0u, 0u, 0u);
#endif
}
else if(type == RESTYPE_TEX2DARRAY)
{
col = texelFetch(texUInt2DArray, ivec3(pos * texRes.xy, slice), mipLevel);
}
else // if (type == RESTYPE_TEX3D)
{
col = texelFetch(texUInt3D, ivec3(pos * texRes.xy, 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
// 1d = 1
layout(binding = 2) uniform PRECISION isampler2D texSInt2D;
layout(binding = 3) uniform PRECISION isampler3D texSInt3D;
// cube = 4
// 1d array = 5
layout(binding = 6) uniform PRECISION isampler2DArray texSInt2DArray;
// cube array = 7
// 2d rect = 8
layout(binding = 9) uniform PRECISION isamplerBuffer texSIntBuffer;
#ifdef GLES_texture_multisample
layout(binding = 10) uniform PRECISION isampler2DMS texSInt2DMS;
#endif
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_TEX2D)
{
col = texelFetch(texSInt2D, ivec2(pos * texRes.xy), mipLevel);
}
else if(type == RESTYPE_TEXBUFFER)
{
col = texelFetch(texSIntBuffer, int(pos.x * texRes.x));
}
else if(type == RESTYPE_TEX2DMS)
{
#ifdef GLES_texture_multisample
if(sampleIdx < 0)
sampleIdx = 0;
col = texelFetch(texSInt2DMS, ivec2(pos * texRes.xy), sampleIdx);
#else
col = ivec4(0, 0, 0, 0);
#endif
}
else if(type == RESTYPE_TEX2DARRAY)
{
col = texelFetch(texSInt2DArray, ivec3(pos * texRes.xy, slice), mipLevel);
}
else // if (type == RESTYPE_TEX3D)
{
col = texelFetch(texSInt3D, ivec3(pos * texRes.xy, slice), mipLevel);
}
return col;
}
#else
// these bindings are defined based on the RESTYPE_ defines in debuguniforms.h
// 1d = 1
layout(binding = 2) uniform PRECISION sampler2D tex2D;
layout(binding = 3) uniform PRECISION sampler3D tex3D;
layout(binding = 4) uniform PRECISION samplerCube texCube;
// 1d array = 5
layout(binding = 6) uniform PRECISION sampler2DArray tex2DArray;
#ifdef GLES_texture_cube_map_array
layout(binding = 7) uniform PRECISION samplerCubeArray texCubeArray;
#endif
// 2d rect = 8
layout(binding = 9) uniform PRECISION samplerBuffer texBuffer;
#ifdef GLES_texture_multisample
layout(binding = 10) uniform PRECISION sampler2DMS tex2DMS;
#endif
vec4 SampleTextureFloat4(int type, vec2 pos, float slice, int mipLevel, int sampleIdx, vec3 texRes)
{
vec4 col;
if(type == RESTYPE_TEX2D)
{
col = textureLod(tex2D, pos, float(mipLevel));
}
else if(type == RESTYPE_TEXBUFFER)
{
col = texelFetch(texBuffer, int(pos.x * texRes.x));
#ifdef OPENGL_ES
// This hack is needed for an Android device to let the compiler optimize out the texBuffer,
// because otherwise due to some compiler bug the RESTYPE_TEX2D case won't work normally.
col = vec4(1.0f, 1.0f, 1.0f, 1.0f);
#endif
}
else if(type == RESTYPE_TEX2DMS)
{
#ifdef GLES_texture_multisample
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
if(sampleCount == 2)
{
col += 0.5f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 0);
col += 0.5f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 1);
}
else if(sampleCount == 4)
{
col += 0.25f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 0);
col += 0.25f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 1);
col += 0.25f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 2);
col += 0.25f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 3);
}
else if(sampleCount == 8)
{
col += 0.125f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 0);
col += 0.125f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 1);
col += 0.125f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 2);
col += 0.125f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 3);
col += 0.125f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 4);
col += 0.125f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 5);
col += 0.125f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 6);
col += 0.125f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 7);
}
else if(sampleCount == 16)
{
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 0);
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 1);
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 2);
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 3);
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 4);
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 5);
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 6);
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 7);
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 8);
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 9);
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 10);
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 11);
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 12);
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 13);
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 14);
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos * texRes.xy), 15);
}
}
else
{
col = texelFetch(tex2DMS, ivec2(pos * texRes.xy), sampleIdx);
}
#else
col = vec4(0.0f, 0.0f, 0.0f, 0.0f);
#endif
}
else if(type == RESTYPE_TEX2DARRAY)
{
col = textureLod(tex2DArray, vec3(pos, slice), float(mipLevel));
}
else if(type == RESTYPE_TEX3D)
{
col = textureLod(tex3D, vec3(pos, slice / texRes.z), float(mipLevel));
}
else if(type == RESTYPE_TEXCUBE)
{
vec3 cubeCoord = CalcCubeCoord(pos, int(slice));
col = textureLod(texCube, cubeCoord, float(mipLevel));
}
else // type == RESTYPE_TEXCUBEARRAY
{
#ifdef GLES_texture_cube_map_array
vec3 cubeCoord = CalcCubeCoord(pos, int(slice) % 6);
vec4 arrayCoord = vec4(cubeCoord, int(slice) / 6);
col = textureLod(texCubeArray, arrayCoord, float(mipLevel));
#else
col = vec4(0.0f, 0.0f, 0.0f, 0.0f);
#endif
}
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
+6
View File
@@ -22,6 +22,10 @@
* THE SOFTWARE.
******************************************************************************/
//#extension_gles GL_EXT_geometry_shader : enable
//#extension_gles GL_OES_geometry_shader : enable
//#extension_gles GL_EXT_geometry_point_size : enable
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
@@ -31,6 +35,7 @@ layout (location = 1) in vec4 IN_norm[3];
layout (location = 0) out vec4 OUT_secondary;
layout (location = 1) out vec4 OUT_norm;
#ifndef OPENGL_ES
in gl_PerVertex
{
vec4 gl_Position;
@@ -42,6 +47,7 @@ out gl_PerVertex
vec4 gl_Position;
float gl_PointSize;
};
#endif
void main()
{
+5 -3
View File
@@ -25,24 +25,26 @@
layout (location = 0) in vec4 position;
layout (location = 1) in vec4 IN_secondary;
#ifndef OPENGL_ES
out gl_PerVertex
{
vec4 gl_Position;
float gl_PointSize;
};
#endif
layout (location = 0) out vec4 OUT_secondary;
layout (location = 1) out vec4 norm;
void main(void)
{
vec2 psprite[4] =
{
vec2 psprite[4] = vec2[]
(
vec2(-1.0f, -1.0f),
vec2(-1.0f, 1.0f),
vec2( 1.0f, -1.0f),
vec2( 1.0f, 1.0f)
};
);
vec4 pos = position;
if(Mesh.homogenousInput == 0u)
+1 -1
View File
@@ -22,7 +22,7 @@
* THE SOFTWARE.
******************************************************************************/
//#extension GL_ARB_compute_shader : require
//#extension_nongles GL_ARB_compute_shader : require
layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+3 -3
View File
@@ -31,11 +31,11 @@ void main(void)
vec2 rectPos = gl_FragCoord.xy - outline.ViewRect.xy;
vec2 rectSize = outline.ViewRect.zw;
vec2 ab = mod(rectPos.xy, 32.0f.xx);
vec2 ab = mod(rectPos.xy, vec2(32.0f));
bool checkerVariant = (
(ab.x < 16 && ab.y < 16) ||
(ab.x > 16 && ab.y > 16)
(ab.x < 16.0f && ab.y < 16.0f) ||
(ab.x > 16.0f && ab.y > 16.0f)
);
if(outline.Scissor == 0u)
+2 -2
View File
@@ -22,7 +22,7 @@
* THE SOFTWARE.
******************************************************************************/
//#extension GL_ARB_shader_image_load_store : require
//#extension_nongles GL_ARB_shader_image_load_store : require
////////////////////////////////////////////////////////////////////////////////////////////
// Below shaders courtesy of Stephen Hill (@self_shadow), converted to glsl trivially
@@ -31,7 +31,7 @@
// https://github.com/selfshadow/demos/blob/master/QuadShading/QuadShading.fx
////////////////////////////////////////////////////////////////////////////////////////////
layout(binding = 0, r32ui) uniform coherent uimage2DArray overdrawImage;
layout(binding = 0, r32ui) uniform PRECISION coherent uimage2DArray overdrawImage;
#define NUM_RAMP_COLOURS 128
+14 -10
View File
@@ -23,10 +23,14 @@
******************************************************************************/
// outer code will hoist this up to just after the #version
//#extension GL_ARB_derivative_control : enable
//#extension GL_ARB_shader_image_load_store : require
//#extension GL_ARB_gpu_shader5 : require
//#extension_gles GL_OES_shader_image_atomic : enable
//#extension_gles GL_OES_sample_variables : enable
//#extension_nongles GL_ARB_derivative_control : enable
//#extension_nongles GL_ARB_shader_image_load_store : require
//#extension_nongles GL_ARB_gpu_shader5 : require
////////////////////////////////////////////////////////////////////////////////////////////
// Below shaders courtesy of Stephen Hill (@self_shadow), converted to glsl trivially
//
@@ -37,8 +41,8 @@
#ifdef VULKAN
// descriptor set will be patched from 0 to whichever descriptor set we're using in code
layout(set = 0, binding = 0, r32ui) uniform coherent uimage2DArray overdrawImage;
#else // OPENGL
layout(binding = 0, r32ui) uniform coherent uimage2DArray overdrawImage;
#else // OPENGL and OPENGL_ES
layout(binding = 0, r32ui) uniform PRECISION coherent uimage2DArray overdrawImage;
#endif
layout(early_fragment_tests) in;
@@ -51,12 +55,12 @@ void main()
// "Shader Amortization using Pixel Quad Message Passing", Eric Penner, GPU Pro 2.)
uvec2 p = uvec2(uint(gl_FragCoord.x) & 1u, uint(gl_FragCoord.y) & 1u);
ivec2 sign = ivec2(p.x > 0u ? -1 : 1, p.y > 0u ? -1 : 1);
uint c1 = c0 + sign.x*int(dFdxFine(c0));
uint c2 = c0 + sign.y*int(dFdyFine(c0));
uint c3 = c2 + sign.x*int(dFdxFine(c2));
uint c1 = c0 + uint(sign.x*int(dFdxFine(c0)));
uint c2 = c0 + uint(sign.y*int(dFdyFine(c0)));
uint c3 = c2 + uint(sign.x*int(dFdxFine(c2)));
// Count the live pixels, minus 1 (zero indexing)
uint pixelCount = c0 + c1 + c2 + c3 - 1;
uint pixelCount = c0 + c1 + c2 + c3 - 1u;
ivec3 quad = ivec3(gl_FragCoord.xy*0.5, pixelCount);
imageAtomicAdd(overdrawImage, quad, 1);
+15 -9
View File
@@ -23,8 +23,14 @@
******************************************************************************/
layout (location = 0) out vec4 color_out;
#ifdef OPENGL_ES
// Required otherwise the shader compiler could remove the 'uv' from the vertex shader also.
layout (location = 0) in vec2 uv;
#endif
//#extension GL_ARB_gpu_shader5 : enable
//#extension_gles GL_EXT_texture_cube_map_array : enable
//#extension_gles GL_EXT_texture_buffer : enable
//#extension_nongles GL_ARB_gpu_shader5 : enable
//#include "texsample.h" // while includes aren't supported in glslang, this will be added in code
@@ -183,41 +189,41 @@ void main(void)
return;
}
if(pre_range_col.r < 0 || pre_range_col.g < 0 || pre_range_col.b < 0 || pre_range_col.a < 0)
if(pre_range_col.r < 0.0f || pre_range_col.g < 0.0f || pre_range_col.b < 0.0f || pre_range_col.a < 0.0f)
{
color_out = vec4(0, 0, 1, 1);
return;
}
col = vec4(dot(col.xyz, vec3(0.2126, 0.7152, 0.0722)).xxx, 1);
col = vec4(vec3(dot(col.xyz, vec3(0.2126, 0.7152, 0.0722))), 1);
}
else if((texdisplay.OutputDisplayFormat & TEXDISPLAY_CLIPPING) > 0)
{
if(col.r < 0 || col.g < 0 || col.b < 0 || col.a < 0)
if(col.r < 0.0f || col.g < 0.0f || col.b < 0.0f || col.a < 0.0f)
{
color_out = vec4(1, 0, 0, 1);
return;
}
if(col.r > (1+FLT_EPSILON) || col.g > (1+FLT_EPSILON) || col.b > (1+FLT_EPSILON) || col.a > (1+FLT_EPSILON))
if(col.r > (1.0f+FLT_EPSILON) || col.g > (1.0f+FLT_EPSILON) || col.b > (1.0f+FLT_EPSILON) || col.a > (1.0f+FLT_EPSILON))
{
color_out = vec4(0, 1, 0, 1);
return;
}
col = vec4(dot(col.xyz, vec3(0.2126, 0.7152, 0.0722)).xxx, 1);
col = vec4(vec3(dot(col.xyz, vec3(0.2126, 0.7152, 0.0722))), 1);
}
else
{
// if only one channel is selected
if(dot(texdisplay.Channels, 1.0f.xxxx) == 1.0f)
if(dot(texdisplay.Channels, vec4(1.0f)) == 1.0f)
{
// if it's alpha, just move it into rgb
// otherwise, select the channel that's on and replicate it across all channels
if(texdisplay.Channels.a == 1)
if(texdisplay.Channels.a == 1.0f)
col = vec4(col.aaa, 1);
else
col = vec4(dot(col.rgb, 1.0f.xxx).xxx, 1.0f);
col = vec4(vec3(dot(col.rgb, vec3(1.0f))), 1.0f);
}
}
+2 -2
View File
@@ -34,7 +34,7 @@ layout (location = 1) in vec2 glyphuv;
void main(void)
{
float text = 0;
float text = 0.0f;
if(glyphuv.x >= 0.0f && glyphuv.x <= 1.0f &&
glyphuv.y >= 0.0f && glyphuv.y <= 1.0f)
@@ -45,5 +45,5 @@ void main(void)
text = texture(tex0, uv.xy).x;
}
color_out = vec4(text.xxx, clamp(text + 0.5f, 0.0f, 1.0f));
color_out = vec4(vec3(text), clamp(text + 0.5f, 0.0f, 1.0f));
}
+3 -1
View File
@@ -22,11 +22,13 @@
* THE SOFTWARE.
******************************************************************************/
#ifndef OPENGL_ES
out gl_PerVertex
{
vec4 gl_Position;
float gl_PointSize;
};
#endif
layout (location = 0) out vec4 tex;
layout (location = 1) out vec2 glyphuv;
@@ -46,7 +48,7 @@ void main(void)
vec3 pos = verts[vert];
uint strindex = uint(VERTEX_ID)/6u;
vec2 charPos = vec2(strindex + pos.x + general.TextPosition.x, pos.y + general.TextPosition.y);
vec2 charPos = vec2(float(strindex) + pos.x + general.TextPosition.x, pos.y + general.TextPosition.y);
FontGlyphData G = glyphs.data[ str.chars[strindex].x ];
+5
View File
@@ -22,6 +22,9 @@
* THE SOFTWARE.
******************************************************************************/
//#extension_gles GL_EXT_geometry_shader : enable
//#extension_gles GL_OES_geometry_shader : enable
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
@@ -30,6 +33,7 @@ layout (location = 1) in vec4 IN_norm[3];
layout (location = 0) out float OUT_pixarea;
#ifndef OPENGL_ES
in gl_PerVertex
{
vec4 gl_Position;
@@ -41,6 +45,7 @@ out gl_PerVertex
vec4 gl_Position;
float gl_PointSize;
};
#endif
layout(binding = 2) uniform ViewportSizeUBO
{
+22 -2
View File
@@ -30,7 +30,8 @@ void GenerateGLSLShader(std::vector<std::string> &sources, ShaderType type,
bool uniforms)
{
sources.resize(4);
sources[0] = StringFormat::Fmt("#version %d core\n", version);
sources[0] =
StringFormat::Fmt("#version %d %s\n", version, type == eShaderGLSLES ? "es" : "core");
if(uniforms)
sources[1] = GetEmbeddedResource(glsl_debuguniforms_h);
@@ -43,6 +44,8 @@ void GenerateGLSLShader(std::vector<std::string> &sources, ShaderType type,
sources[2] = GetEmbeddedResource(glsl_vk_texsample_h);
else if(type == eShaderGLSL)
sources[2] = GetEmbeddedResource(glsl_gl_texsample_h);
else if(type == eShaderGLSLES)
sources[2] = GetEmbeddedResource(glsl_gles_texsample_h);
else
RDCERR("Unknown type! %d", type);
}
@@ -67,7 +70,24 @@ void GenerateGLSLShader(std::vector<std::string> &sources, ShaderType type,
size_t begin = extsearch;
extsearch = sources[i].find('\n', extsearch);
sources[0] += sources[i].substr(begin, extsearch - begin + 1);
string ext = sources[i].substr(begin, extsearch - begin + 1);
if(ext.find("#extension_gles") == 0)
{
if(type != eShaderGLSLES)
continue;
ext.erase(ext.find("_gles"), 5);
}
else if(ext.find("#extension_nongles") == 0)
{
if(type == eShaderGLSLES)
continue;
ext.erase(ext.find("_nongles"), 8);
}
sources[0] += ext;
} while(extsearch != string::npos);
}
+1
View File
@@ -25,6 +25,7 @@
enum ShaderType
{
eShaderGLSL,
eShaderGLSLES,
eShaderVulkan
};
+1
View File
@@ -137,6 +137,7 @@ RESOURCE_glsl_trisize_geom TYPE_EMBED "glsl/trisize.geom"
RESOURCE_glsl_trisize_frag TYPE_EMBED "glsl/trisize.frag"
RESOURCE_glsl_deptharr2ms_frag TYPE_EMBED "glsl/deptharr2ms.frag"
RESOURCE_glsl_depthms2arr_frag TYPE_EMBED "glsl/depthms2arr.frag"
RESOURCE_glsl_gles_texsample_h TYPE_EMBED "glsl/gles_texsample.h"
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
+1
View File
@@ -39,6 +39,7 @@
#define RESOURCE_glsl_trisize_frag 425
#define RESOURCE_glsl_deptharr2ms_frag 426
#define RESOURCE_glsl_depthms2arr_frag 427
#define RESOURCE_glsl_gles_texsample_h 428
//#define RENDERDOC_OFFICIAL_BUILD // used to determine whether to submit auto crash reports
+45 -25
View File
@@ -262,7 +262,27 @@ void GLReplay::InitDebugData()
vector<string> gs;
vector<string> cs;
GenerateGLSLShader(vs, eShaderGLSL, "", GetEmbeddedResource(glsl_blit_vert), 150);
int glslVersion;
int glslBaseVer;
int glslCSVer; // compute shader
ShaderType shaderType;
if(m_pDriver->isGLESMode())
{
glslVersion = glslBaseVer = glslCSVer = 310;
shaderType = eShaderGLSLES;
}
else
{
glslVersion = glslBaseVer = 150;
glslCSVer = 420;
shaderType = eShaderGLSL;
}
// TODO In case of GLES some currently unused shaders, which are guarded by HasExt[..] checks,
// still contain compile errors (e.g. array2ms.comp, ms2array.comp, quad*, etc.).
GenerateGLSLShader(vs, shaderType, "", GetEmbeddedResource(glsl_blit_vert), glslBaseVer);
DebugData.texDisplayVSProg = CreateShaderProgram(vs, empty);
@@ -271,16 +291,15 @@ void GLReplay::InitDebugData()
string defines = string("#define UINT_TEX ") + (i == 1 ? "1" : "0") + "\n";
defines += string("#define SINT_TEX ") + (i == 2 ? "1" : "0") + "\n";
GenerateGLSLShader(fs, eShaderGLSL, defines, GetEmbeddedResource(glsl_texdisplay_frag), 150);
GenerateGLSLShader(fs, shaderType, defines, GetEmbeddedResource(glsl_texdisplay_frag),
glslBaseVer);
DebugData.texDisplayProg[i] = CreateShaderProgram(empty, fs);
}
RenderDoc::Inst().SetProgress(DebugManagerInit, 0.2f);
int glslVersion = 150;
if(GLCoreVersion >= 43)
if(GLCoreVersion >= 43 && !m_pDriver->isGLESMode()) // TODO gles
{
GLint numsl = 0;
gl.glGetIntegerv(eGL_NUM_SHADING_LANGUAGE_VERSIONS, &numsl);
@@ -303,7 +322,7 @@ void GLReplay::InitDebugData()
RDCLOG("GLSL version %d", glslVersion);
GenerateGLSLShader(vs, eShaderGLSL, "", GetEmbeddedResource(glsl_blit_vert), 150);
GenerateGLSLShader(vs, shaderType, "", GetEmbeddedResource(glsl_blit_vert), glslBaseVer);
if(HasExt[ARB_shader_image_load_store] && HasExt[ARB_gpu_shader5])
{
@@ -322,12 +341,12 @@ void GLReplay::InitDebugData()
"Quad overdraw requires GLSL 4.50 for dFd(xy)fine, using possibly coarse dFd(xy).");
}
GenerateGLSLShader(fs, eShaderGLSL, defines, GetEmbeddedResource(glsl_quadwrite_frag),
GenerateGLSLShader(fs, shaderType, defines, GetEmbeddedResource(glsl_quadwrite_frag),
RDCMIN(450, glslVersion));
DebugData.quadoverdrawFSProg = CreateShaderProgram(empty, fs);
GenerateGLSLShader(fs, eShaderGLSL, "", GetEmbeddedResource(glsl_quadresolve_frag), 150);
GenerateGLSLShader(fs, shaderType, "", GetEmbeddedResource(glsl_quadresolve_frag), glslBaseVer);
DebugData.quadoverdrawResolveProg = CreateShaderProgram(vs, fs);
}
@@ -344,22 +363,22 @@ void GLReplay::InitDebugData()
DebugData.quadoverdrawResolveProg = 0;
}
GenerateGLSLShader(fs, eShaderGLSL, "", GetEmbeddedResource(glsl_checkerboard_frag), 150);
GenerateGLSLShader(fs, shaderType, "", GetEmbeddedResource(glsl_checkerboard_frag), glslBaseVer);
DebugData.checkerProg = CreateShaderProgram(vs, fs);
GenerateGLSLShader(fs, eShaderGLSL, "", GetEmbeddedResource(glsl_fixedcol_frag), 150);
GenerateGLSLShader(fs, shaderType, "", GetEmbeddedResource(glsl_fixedcol_frag), glslBaseVer);
DebugData.fixedcolFSProg = CreateShaderProgram(empty, fs);
GenerateGLSLShader(vs, eShaderGLSL, "", GetEmbeddedResource(glsl_mesh_vert), 150);
GenerateGLSLShader(fs, eShaderGLSL, "", GetEmbeddedResource(glsl_mesh_frag), 150);
GenerateGLSLShader(gs, eShaderGLSL, "", GetEmbeddedResource(glsl_mesh_geom), 150);
GenerateGLSLShader(vs, shaderType, "", GetEmbeddedResource(glsl_mesh_vert), glslBaseVer);
GenerateGLSLShader(fs, shaderType, "", GetEmbeddedResource(glsl_mesh_frag), glslBaseVer);
GenerateGLSLShader(gs, shaderType, "", GetEmbeddedResource(glsl_mesh_geom), glslBaseVer);
DebugData.meshProg = CreateShaderProgram(vs, fs);
DebugData.meshgsProg = CreateShaderProgram(vs, fs, gs);
GenerateGLSLShader(fs, eShaderGLSL, "", GetEmbeddedResource(glsl_trisize_frag), 150);
GenerateGLSLShader(gs, eShaderGLSL, "", GetEmbeddedResource(glsl_trisize_geom), 150);
GenerateGLSLShader(fs, shaderType, "", GetEmbeddedResource(glsl_trisize_frag), glslBaseVer);
GenerateGLSLShader(gs, shaderType, "", GetEmbeddedResource(glsl_trisize_geom), glslBaseVer);
DebugData.trisizeProg = CreateShaderProgram(vs, fs, gs);
@@ -454,8 +473,8 @@ void GLReplay::InitDebugData()
defines += string("#define UINT_TEX ") + (i == 1 ? "1" : "0") + "\n";
defines += string("#define SINT_TEX ") + (i == 2 ? "1" : "0") + "\n";
GenerateGLSLShader(cs, eShaderGLSL, defines, GetEmbeddedResource(glsl_minmaxtile_comp),
420);
GenerateGLSLShader(cs, shaderType, defines, GetEmbeddedResource(glsl_minmaxtile_comp),
glslCSVer);
DebugData.minmaxTileProgram[idx] = CreateCShaderProgram(cs);
}
@@ -466,7 +485,8 @@ void GLReplay::InitDebugData()
defines += string("#define UINT_TEX ") + (i == 1 ? "1" : "0") + "\n";
defines += string("#define SINT_TEX ") + (i == 2 ? "1" : "0") + "\n";
GenerateGLSLShader(cs, eShaderGLSL, defines, GetEmbeddedResource(glsl_histogram_comp), 420);
GenerateGLSLShader(cs, shaderType, defines, GetEmbeddedResource(glsl_histogram_comp),
glslCSVer);
DebugData.histogramProgram[idx] = CreateCShaderProgram(cs);
}
@@ -478,8 +498,8 @@ void GLReplay::InitDebugData()
defines += string("#define UINT_TEX ") + (i == 1 ? "1" : "0") + "\n";
defines += string("#define SINT_TEX ") + (i == 2 ? "1" : "0") + "\n";
GenerateGLSLShader(cs, eShaderGLSL, defines, GetEmbeddedResource(glsl_minmaxresult_comp),
420);
GenerateGLSLShader(cs, shaderType, defines, GetEmbeddedResource(glsl_minmaxresult_comp),
glslCSVer);
DebugData.minmaxResultProgram[i] = CreateCShaderProgram(cs);
}
@@ -513,10 +533,10 @@ void GLReplay::InitDebugData()
if(HasExt[ARB_compute_shader])
{
GenerateGLSLShader(cs, eShaderGLSL, "", GetEmbeddedResource(glsl_ms2array_comp), 420);
GenerateGLSLShader(cs, shaderType, "", GetEmbeddedResource(glsl_ms2array_comp), glslCSVer);
DebugData.MS2Array = CreateCShaderProgram(cs);
GenerateGLSLShader(cs, eShaderGLSL, "", GetEmbeddedResource(glsl_array2ms_comp), 420);
GenerateGLSLShader(cs, shaderType, "", GetEmbeddedResource(glsl_array2ms_comp), glslCSVer);
DebugData.Array2MS = CreateCShaderProgram(cs);
}
else
@@ -534,7 +554,7 @@ void GLReplay::InitDebugData()
string defines =
"#extension GL_ARB_compute_shader : require\n"
"#extension GL_ARB_shader_storage_buffer_object : require";
GenerateGLSLShader(cs, eShaderGLSL, defines, GetEmbeddedResource(glsl_mesh_comp), 420);
GenerateGLSLShader(cs, shaderType, defines, GetEmbeddedResource(glsl_mesh_comp), glslCSVer);
DebugData.meshPickProgram = CreateCShaderProgram(cs);
}
else
@@ -617,8 +637,8 @@ void GLReplay::InitDebugData()
gl.glVertexAttribPointer(0, 4, eGL_FLOAT, GL_FALSE, sizeof(Vec4f), NULL);
gl.glEnableVertexAttribArray(0);
GenerateGLSLShader(vs, eShaderGLSL, "", GetEmbeddedResource(glsl_blit_vert), 150);
GenerateGLSLShader(fs, eShaderGLSL, "", GetEmbeddedResource(glsl_outline_frag), 150);
GenerateGLSLShader(vs, shaderType, "", GetEmbeddedResource(glsl_blit_vert), glslBaseVer);
GenerateGLSLShader(fs, shaderType, "", GetEmbeddedResource(glsl_outline_frag), glslBaseVer);
DebugData.outlineQuadProg = CreateShaderProgram(vs, fs);
+25 -8
View File
@@ -29,6 +29,7 @@
#include "data/glsl_shaders.h"
#include "driver/shaders/spirv/spirv_common.h"
#include "jpeg-compressor/jpge.h"
#include "maths/matrix.h"
#include "maths/vec.h"
#include "replay/type_helpers.h"
#include "serialise/string_utils.h"
@@ -1103,7 +1104,7 @@ void WrappedOpenGL::ContextData::AssociateWindow(WrappedOpenGL *gl, void *wndHan
windows[wndHandle] = Timing::GetUnixTimestamp();
}
void WrappedOpenGL::ContextData::CreateDebugData(const GLHookSet &gl)
void WrappedOpenGL::ContextData::CreateDebugData(const GLHookSet &gl, const bool isGLESMode)
{
// to let us display the overlay on old GL contexts, use as simple a subset of functionality as
// possible
@@ -1206,13 +1207,29 @@ void WrappedOpenGL::ContextData::CreateDebugData(const GLHookSet &gl)
vector<string> vs;
vector<string> fs;
GenerateGLSLShader(vs, eShaderGLSL, "", GetEmbeddedResource(glsl_text_vert), 150);
ShaderType shaderType;
int glslVersion;
string fragDefines;
GenerateGLSLShader(fs, eShaderGLSL,
"#extension GL_ARB_shading_language_420pack : require\n"
"#extension GL_ARB_separate_shader_objects : require\n"
"#extension GL_ARB_explicit_attrib_location : require\n",
GetEmbeddedResource(glsl_text_frag), 150);
if(isGLESMode)
{
shaderType = eShaderGLSLES;
glslVersion = 310;
fragDefines = "";
}
else
{
shaderType = eShaderGLSL;
glslVersion = 150;
fragDefines =
"#extension GL_ARB_shading_language_420pack : require\n"
"#extension GL_ARB_separate_shader_objects : require\n"
"#extension GL_ARB_explicit_attrib_location : require\n";
}
GenerateGLSLShader(vs, shaderType, "", GetEmbeddedResource(glsl_text_vert), glslVersion);
GenerateGLSLShader(fs, shaderType, fragDefines, GetEmbeddedResource(glsl_text_frag),
glslVersion);
vector<const char *> vsc;
vsc.reserve(vs.size());
@@ -2270,7 +2287,7 @@ void WrappedOpenGL::SwapBuffers(void *windowHandle)
// that might be shared later (wglShareLists requires contexts to be
// pristine, so can't create this from wglMakeCurrent)
if(!ctxdata.ready)
ctxdata.CreateDebugData(m_Real);
ctxdata.CreateDebugData(m_Real, isGLESMode());
bool activeWindow = RenderDoc::Inst().IsActiveWindow(ctxdata.ctx, windowHandle);
+1 -1
View File
@@ -413,7 +413,7 @@ private:
void UnassociateWindow(void *wndHandle);
void AssociateWindow(WrappedOpenGL *gl, void *wndHandle);
void CreateDebugData(const GLHookSet &gl);
void CreateDebugData(const GLHookSet &gl, const bool isGLESMode);
bool Legacy() { return !attribsCreate || version < 32; }
bool Modern() { return !Legacy(); }
+1
View File
@@ -24,6 +24,7 @@
******************************************************************************/
#include "gl_replay.h"
#include "maths/matrix.h"
#include "serialise/string_utils.h"
#include "gl_driver.h"
#include "gl_resources.h"
+1
View File
@@ -260,6 +260,7 @@
<ClInclude Include="data\embedded_files.h" />
<ClInclude Include="data\glsl\debuguniforms.h" />
<ClInclude Include="data\glsl\gl_texsample.h" />
<ClInclude Include="data\glsl\gles_texsample.h" />
<ClInclude Include="data\glsl\vk_texsample.h" />
<ClInclude Include="data\glsl_shaders.h" />
<ClInclude Include="data\hlsl\debugcbuffers.h" />
+3
View File
@@ -249,6 +249,9 @@
<ClInclude Include="data\glsl\gl_texsample.h">
<Filter>Resources\glsl</Filter>
</ClInclude>
<ClInclude Include="data\glsl\gles_texsample.h">
<Filter>Resources\glsl</Filter>
</ClInclude>
<ClInclude Include="data\glsl\vk_texsample.h">
<Filter>Resources\glsl</Filter>
</ClInclude>