Make internal vulkan shaders compatible with GL with a few #ifdefs

This commit is contained in:
baldurk
2016-07-21 19:11:33 +02:00
parent a9f5f84a76
commit 9e786f258c
12 changed files with 137 additions and 21 deletions
+1 -1
View File
@@ -35,5 +35,5 @@ void main(void)
vec4(-1.0, 1.0, 0.5, 1.0),
vec4( 1.0, 1.0, 0.5, 1.0));
gl_Position = verts[gl_VertexIndex];
gl_Position = verts[VERTEX_ID];
}
+51 -10
View File
@@ -37,7 +37,7 @@
#define mat4 Matrix4f
#define uint uint32_t
#define BINDING(s, b)
#define BINDING(b)
#define INST_NAME(name)
struct Vec4u
@@ -47,18 +47,41 @@ struct Vec4u
#define uvec4 Vec4u
#if !defined(VULKAN) && !defined(OPENGL)
#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"
#endif
#else
// this has to happen above even any pre-processor definitions,
// so it's added in code
//#version 430 core
#define BINDING(s, b) layout(set = s, binding = b, std140)
#ifdef VULKAN
#define BINDING(b) layout(set = 0, binding = b, std140)
#define VERTEX_ID gl_VertexIndex
#define INSTANCE_ID gl_InstanceIndex
#else
#define OPENGL 1
#define BINDING(b) layout(binding = b, std140)
#define VERTEX_ID gl_VertexID
#define INSTANCE_ID gl_InstanceID
#endif
#define INST_NAME(name) name
#endif
BINDING(0, 2) uniform HistogramUBOData
BINDING(2) uniform HistogramUBOData
{
uint HistogramChannels;
float HistogramMin;
@@ -75,7 +98,7 @@ BINDING(0, 2) uniform HistogramUBOData
}
INST_NAME(histogram_minmax);
BINDING(0, 0) uniform MeshUBOData
BINDING(0) uniform MeshUBOData
{
mat4 mvp;
mat4 invProj;
@@ -86,7 +109,7 @@ BINDING(0, 0) uniform MeshUBOData
}
INST_NAME(Mesh);
BINDING(0, 0) uniform OutlineUBOData
BINDING(0) uniform OutlineUBOData
{
vec4 Inner_Color;
vec4 Border_Color;
@@ -96,7 +119,7 @@ BINDING(0, 0) uniform OutlineUBOData
}
INST_NAME(outline);
BINDING(0, 0) uniform FontUBOData
BINDING(0) uniform FontUBOData
{
vec2 TextPosition;
float txtpadding;
@@ -107,7 +130,7 @@ BINDING(0, 0) uniform FontUBOData
}
INST_NAME(general);
BINDING(0, 0) uniform MeshPickUBOData
BINDING(0) uniform MeshPickUBOData
{
vec2 coords;
vec2 viewport;
@@ -130,7 +153,7 @@ struct FontGlyphData
#define FONT_FIRST_CHAR 32
#define FONT_LAST_CHAR 126
BINDING(0, 1) uniform GlyphUBOData
BINDING(1) uniform GlyphUBOData
{
FontGlyphData data[FONT_LAST_CHAR - FONT_FIRST_CHAR + 1];
}
@@ -138,13 +161,13 @@ INST_NAME(glyphs);
#define MAX_SINGLE_LINE_LENGTH 256
BINDING(0, 2) uniform StringUBOData
BINDING(2) uniform StringUBOData
{
uvec4 chars[MAX_SINGLE_LINE_LENGTH];
}
INST_NAME(str);
BINDING(0, 0) uniform TexDisplayUBOData
BINDING(0) uniform TexDisplayUBOData
{
vec2 Position;
float Scale;
@@ -178,6 +201,8 @@ INST_NAME(texdisplay);
#define CUBEMAP_FACE_POS_Z 4
#define CUBEMAP_FACE_NEG_Z 5
#ifdef VULKAN
// we always upload an array (but it might have only one layer),
// so 2D and 2D arrays are the same.
// Cube and cube array textures are treated as 2D arrays.
@@ -187,6 +212,22 @@ INST_NAME(texdisplay);
#define RESTYPE_TEX2DMS 0x4
#define RESTYPE_TEXTYPEMAX 0x5
#else // OPENGL
#define RESTYPE_TEX1D 0x1
#define RESTYPE_TEX2D 0x2
#define RESTYPE_TEX3D 0x3
#define RESTYPE_TEXCUBE 0x4
#define RESTYPE_TEX1DARRAY 0x5
#define RESTYPE_TEX2DARRAY 0x6
#define RESTYPE_TEXCUBEARRAY 0x7
#define RESTYPE_TEXRECT 0x8
#define RESTYPE_TEXBUFFER 0x9
#define RESTYPE_TEX2DMS 0xA
#define RESTYPE_TEXTYPEMAX 0xA
#endif
#define MESHDISPLAY_SOLID 0x1
#define MESHDISPLAY_FACELIT 0x2
#define MESHDISPLAY_SECONDARY 0x3
+12 -4
View File
@@ -27,11 +27,19 @@
layout (location = 0) out vec4 color_out;
#ifndef VULKAN // OpenGL can't use SPIR-V patching
uniform vec4 RENDERDOC_GenericFS_Color;
#endif
void main(void)
{
// used to have a shader-replacement pixel shader
// that outputs a fixed colour, without needing a
// slot in a descriptor set. We re-write the SPIR-V
// on the fly to replace these constants
#ifdef VULKAN
// used to have a shader-replacement pixel shader
// that outputs a fixed colour, without needing a
// slot in a descriptor set. We re-write the SPIR-V
// on the fly to replace these constants
color_out = vec4(1.1f, 2.2f, 3.3f, 4.4f);
#else
color_out = RENDERDOC_GenericFS_Color;
#endif
}
+2
View File
@@ -57,8 +57,10 @@ void main()
wpos.xyz /= wpos.www;
#ifdef VULKAN
if(meshpick.unproject == 0u)
wpos.xy *= vec2(1.0f, -1.0f);
#endif
vec2 scr = (wpos.xy + 1.0f) * 0.5f * meshpick.viewport;
+9 -1
View File
@@ -50,18 +50,26 @@ void main(void)
vec4 pos = position;
if(Mesh.homogenousInput == 0)
{
pos = vec4(position.xyz, 1);
}
else
{
#ifdef VULKAN
pos = vec4(position.x, -position.y, position.z, position.w);
#endif
}
gl_Position = Mesh.mvp * pos;
gl_Position.xy += Mesh.pointSpriteSize.xy*0.01f*psprite[gl_VertexIndex%4]*gl_Position.w;
gl_Position.xy += Mesh.pointSpriteSize.xy*0.01f*psprite[VERTEX_ID%4]*gl_Position.w;
OUT.secondary = secondary;
OUT.norm = vec4(0, 0, 1, 1);
#ifdef VULKAN
// GL->VK conventions
gl_Position.y = -gl_Position.y;
gl_Position.z = (gl_Position.z + gl_Position.w) / 2.0;
gl_PointSize = 4.0f;
#endif
}
+4
View File
@@ -32,8 +32,12 @@
// https://github.com/selfshadow/demos/blob/master/QuadShading/QuadShading.fx
////////////////////////////////////////////////////////////////////////////////////////////
#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;
#endif
layout(early_fragment_tests) in;
void main()
+26 -1
View File
@@ -36,8 +36,23 @@ float ConvertSRGBToLinear(float srgb)
void main(void)
{
#ifdef VULKAN // vulkan combines all three types
bool uintTex = (texdisplay.OutputDisplayFormat & TEXDISPLAY_UINT_TEX) != 0;
bool sintTex = (texdisplay.OutputDisplayFormat & TEXDISPLAY_SINT_TEX) != 0;
#else // OPENGL
#if UINT_TEX
const bool uintTex = true;
const bool sintTex = false;
#elif SINT_TEX
const bool uintTex = false;
const bool sintTex = true;
#else
const bool uintTex = false;
const bool sintTex = false;
#endif
#endif
int texType = (texdisplay.OutputDisplayFormat & TEXDISPLAY_TYPEMASK);
@@ -46,11 +61,21 @@ void main(void)
ivec4 scol;
// calc screen co-ords with origin top left, modified by Position
vec2 scr = gl_FragCoord.xy - texdisplay.Position.xy;
vec2 scr = gl_FragCoord.xy;
#ifdef OPENGL
scr.y = OutputRes.y - scr.y;
#endif
scr -= texdisplay.Position.xy;
scr /= texdisplay.Scale;
#ifdef VULKAN
if(texType == RESTYPE_TEX1D)
#else
if(texType == RESTYPE_TEX1D || texType == RESTYPE_TEXBUFFER || texType == RESTYPE_TEX1DARRAY)
#endif
{
// by convention display 1D textures as 100 high
if(scr.x < 0.0f || scr.x > texdisplay.TextureResolutionPS.x || scr.y < 0.0f || scr.y > 100.0f)
+20
View File
@@ -22,6 +22,26 @@
* 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;
}
// these bindings are defined based on the RESTYPE_ defines in debuguniforms.h
// binding = 5 + RESTYPE_x
+4
View File
@@ -22,7 +22,11 @@
* THE SOFTWARE.
******************************************************************************/
#ifdef VULKAN
layout (binding = 3) uniform sampler2D tex0;
#else // OPENGL
layout (binding = 0) uniform sampler2D tex0;
#endif
layout (location = 0) out vec4 color_out;
layout (location = 0) in vec4 tex;
+2 -2
View File
@@ -38,8 +38,8 @@ void main(void)
vec3( 0.0, 1.0, 0.5),
vec3( 1.0, 1.0, 0.5));
vec3 pos = verts[gl_VertexIndex];
uint strindex = gl_InstanceIndex;
vec3 pos = verts[VERTEX_ID];
uint strindex = INSTANCE_ID;
vec2 charPos = vec2(strindex + pos.x + general.TextPosition.x, pos.y + general.TextPosition.y);
+3 -1
View File
@@ -27,7 +27,6 @@
#include "3rdparty/glslang/SPIRV/spirv.hpp"
#include "3rdparty/stb/stb_truetype.h"
#include "common/shader_cache.h"
#include "data/spv/debuguniforms.h"
#include "driver/shaders/spirv/spirv_common.h"
#include "maths/camera.h"
#include "maths/formatpacking.h"
@@ -35,6 +34,9 @@
#include "serialise/string_utils.h"
#include "vk_core.h"
#define VULKAN 1
#include "data/spv/debuguniforms.h"
const VkDeviceSize STAGE_BUFFER_BYTE_SIZE = 16 * 1024 * 1024ULL;
void VulkanDebugManager::GPUBuffer::Create(WrappedVulkan *driver, VkDevice dev, VkDeviceSize size,
+3 -1
View File
@@ -24,7 +24,6 @@
#include "vk_replay.h"
#include <float.h>
#include "data/spv/debuguniforms.h"
#include "maths/camera.h"
#include "maths/matrix.h"
#include "serialise/string_utils.h"
@@ -32,6 +31,9 @@
#include "vk_debug.h"
#include "vk_resources.h"
#define VULKAN 1
#include "data/spv/debuguniforms.h"
VulkanReplay::OutputWindow::OutputWindow() : wnd(NULL_WND_HANDLE), width(0), height(0)
{
surface = VK_NULL_HANDLE;