mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-07-30 11:21:01 +00:00
Clean up GL/Vulkan display shader, fixes remapping of mips. Refs #390
This commit is contained in:
@@ -195,7 +195,8 @@ BINDING(0) uniform TexDisplayUBOData
|
||||
float Slice;
|
||||
|
||||
int SampleIdx;
|
||||
vec3 Padding;
|
||||
float MipShift;
|
||||
vec2 Padding;
|
||||
}
|
||||
INST_NAME(texdisplay);
|
||||
|
||||
|
||||
@@ -68,52 +68,38 @@ uvec4 SampleTextureUInt4(int type, vec2 pos, float slice, int mipLevel, int samp
|
||||
uvec4 col;
|
||||
if(type == RESTYPE_TEX1D)
|
||||
{
|
||||
int size = textureSize(texUInt1D, mipLevel);
|
||||
|
||||
col = texelFetch(texUInt1D, int(pos.x), mipLevel);
|
||||
col = texelFetch(texUInt1D, int(pos.x * texRes.x), mipLevel);
|
||||
}
|
||||
else if(type == RESTYPE_TEX1DARRAY)
|
||||
{
|
||||
ivec2 size = textureSize(texUInt1DArray, mipLevel);
|
||||
|
||||
col = texelFetch(texUInt1DArray, ivec2(pos.x, slice), mipLevel);
|
||||
col = texelFetch(texUInt1DArray, ivec2(pos.x * texRes.x, slice), mipLevel);
|
||||
}
|
||||
else if(type == RESTYPE_TEX2D)
|
||||
{
|
||||
ivec2 size = textureSize(texUInt2D, mipLevel);
|
||||
|
||||
col = texelFetch(texUInt2D, ivec2(pos), mipLevel);
|
||||
col = texelFetch(texUInt2D, ivec2(pos * texRes.xy), mipLevel);
|
||||
}
|
||||
else if(type == RESTYPE_TEXRECT)
|
||||
{
|
||||
ivec2 size = textureSize(texUInt2DRect);
|
||||
|
||||
col = texelFetch(texUInt2DRect, ivec2(pos));
|
||||
col = texelFetch(texUInt2DRect, ivec2(pos * texRes.xy));
|
||||
}
|
||||
else if(type == RESTYPE_TEXBUFFER)
|
||||
{
|
||||
col = texelFetch(texUIntBuffer, int(pos.x));
|
||||
col = texelFetch(texUIntBuffer, int(pos.x * texRes.x));
|
||||
}
|
||||
else if(type == RESTYPE_TEX2DMS)
|
||||
{
|
||||
ivec2 size = textureSize(texUInt2DMS);
|
||||
|
||||
if(sampleIdx < 0)
|
||||
sampleIdx = 0;
|
||||
|
||||
col = texelFetch(texUInt2DMS, ivec2(pos), sampleIdx);
|
||||
col = texelFetch(texUInt2DMS, ivec2(pos * texRes.xy), sampleIdx);
|
||||
}
|
||||
else if(type == RESTYPE_TEX2DARRAY)
|
||||
{
|
||||
ivec3 size = textureSize(texUInt2DArray, mipLevel);
|
||||
|
||||
col = texelFetch(texUInt2DArray, ivec3(pos, slice), mipLevel);
|
||||
col = texelFetch(texUInt2DArray, ivec3(pos * texRes.xy, slice), mipLevel);
|
||||
}
|
||||
else // if (type == RESTYPE_TEX3D)
|
||||
{
|
||||
ivec3 size = textureSize(texUInt3D, mipLevel);
|
||||
|
||||
col = texelFetch(texUInt3D, ivec3(pos, slice), mipLevel);
|
||||
col = texelFetch(texUInt3D, ivec3(pos * texRes.xy, slice), mipLevel);
|
||||
}
|
||||
|
||||
return col;
|
||||
@@ -154,52 +140,38 @@ ivec4 SampleTextureSInt4(int type, vec2 pos, float slice, int mipLevel, int samp
|
||||
ivec4 col;
|
||||
if(type == RESTYPE_TEX1D)
|
||||
{
|
||||
int size = textureSize(texSInt1D, mipLevel);
|
||||
|
||||
col = texelFetch(texSInt1D, int(pos.x), mipLevel);
|
||||
col = texelFetch(texSInt1D, int(pos.x * texRes.x), mipLevel);
|
||||
}
|
||||
else if(type == RESTYPE_TEX1DARRAY)
|
||||
{
|
||||
ivec2 size = textureSize(texSInt1DArray, mipLevel);
|
||||
|
||||
col = texelFetch(texSInt1DArray, ivec2(pos.x, slice), mipLevel);
|
||||
col = texelFetch(texSInt1DArray, ivec2(pos.x * texRes.x, slice), mipLevel);
|
||||
}
|
||||
else if(type == RESTYPE_TEX2D)
|
||||
{
|
||||
ivec2 size = textureSize(texSInt2D, mipLevel);
|
||||
|
||||
col = texelFetch(texSInt2D, ivec2(pos), mipLevel);
|
||||
col = texelFetch(texSInt2D, ivec2(pos * texRes.xy), mipLevel);
|
||||
}
|
||||
else if(type == RESTYPE_TEXRECT)
|
||||
{
|
||||
ivec2 size = textureSize(texSInt2DRect);
|
||||
|
||||
col = texelFetch(texSInt2DRect, ivec2(pos));
|
||||
col = texelFetch(texSInt2DRect, ivec2(pos * texRes.xy));
|
||||
}
|
||||
else if(type == RESTYPE_TEXBUFFER)
|
||||
{
|
||||
col = texelFetch(texSIntBuffer, int(pos.x));
|
||||
col = texelFetch(texSIntBuffer, int(pos.x * texRes.x));
|
||||
}
|
||||
else if(type == RESTYPE_TEX2DMS)
|
||||
{
|
||||
ivec2 size = textureSize(texSInt2DMS);
|
||||
|
||||
if(sampleIdx < 0)
|
||||
sampleIdx = 0;
|
||||
|
||||
col = texelFetch(texSInt2DMS, ivec2(pos), sampleIdx);
|
||||
col = texelFetch(texSInt2DMS, ivec2(pos * texRes.xy), sampleIdx);
|
||||
}
|
||||
else if(type == RESTYPE_TEX2DARRAY)
|
||||
{
|
||||
ivec3 size = textureSize(texSInt2DArray, mipLevel);
|
||||
|
||||
col = texelFetch(texSInt2DArray, ivec3(pos, slice), mipLevel);
|
||||
col = texelFetch(texSInt2DArray, ivec3(pos * texRes.xy, slice), mipLevel);
|
||||
}
|
||||
else // if (type == RESTYPE_TEX3D)
|
||||
{
|
||||
ivec3 size = textureSize(texSInt3D, mipLevel);
|
||||
|
||||
col = texelFetch(texSInt3D, ivec3(pos, slice), mipLevel);
|
||||
col = texelFetch(texSInt3D, ivec3(pos * texRes.xy, slice), mipLevel);
|
||||
}
|
||||
|
||||
return col;
|
||||
@@ -225,36 +197,26 @@ vec4 SampleTextureFloat4(int type, vec2 pos, float slice, int mipLevel, int samp
|
||||
vec4 col;
|
||||
if(type == RESTYPE_TEX1D)
|
||||
{
|
||||
int size = textureSize(tex1D, mipLevel);
|
||||
|
||||
col = textureLod(tex1D, pos.x / size, float(mipLevel));
|
||||
col = textureLod(tex1D, pos.x, float(mipLevel));
|
||||
}
|
||||
else if(type == RESTYPE_TEX1DARRAY)
|
||||
{
|
||||
ivec2 size = textureSize(tex1DArray, mipLevel);
|
||||
|
||||
col = textureLod(tex1DArray, vec2(pos.x / size.x, slice), float(mipLevel));
|
||||
col = textureLod(tex1DArray, vec2(pos.x, slice), float(mipLevel));
|
||||
}
|
||||
else if(type == RESTYPE_TEX2D)
|
||||
{
|
||||
ivec2 size = textureSize(tex2D, mipLevel);
|
||||
|
||||
col = textureLod(tex2D, pos / size, float(mipLevel));
|
||||
col = textureLod(tex2D, pos, float(mipLevel));
|
||||
}
|
||||
else if(type == RESTYPE_TEXRECT)
|
||||
{
|
||||
ivec2 size = textureSize(tex2DRect);
|
||||
|
||||
col = texelFetch(tex2DRect, ivec2(pos));
|
||||
col = texelFetch(tex2DRect, ivec2(pos * texRes.xy));
|
||||
}
|
||||
else if(type == RESTYPE_TEXBUFFER)
|
||||
{
|
||||
col = texelFetch(texBuffer, int(pos.x));
|
||||
col = texelFetch(texBuffer, int(pos.x * texRes.x));
|
||||
}
|
||||
else if(type == RESTYPE_TEX2DMS)
|
||||
{
|
||||
ivec2 size = textureSize(tex2DMS);
|
||||
|
||||
if(sampleIdx < 0)
|
||||
{
|
||||
int sampleCount = -sampleIdx;
|
||||
@@ -264,77 +226,69 @@ vec4 SampleTextureFloat4(int type, vec2 pos, float slice, int mipLevel, int samp
|
||||
// sampleCount seems to produce crazy artifacts on nvidia - probably a compiler bug
|
||||
if(sampleCount == 2)
|
||||
{
|
||||
col += 0.5f * texelFetch(tex2DMS, ivec2(pos), 0);
|
||||
col += 0.5f * texelFetch(tex2DMS, ivec2(pos), 1);
|
||||
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), 0);
|
||||
col += 0.25f * texelFetch(tex2DMS, ivec2(pos), 1);
|
||||
col += 0.25f * texelFetch(tex2DMS, ivec2(pos), 2);
|
||||
col += 0.25f * texelFetch(tex2DMS, ivec2(pos), 3);
|
||||
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), 0);
|
||||
col += 0.125f * texelFetch(tex2DMS, ivec2(pos), 1);
|
||||
col += 0.125f * texelFetch(tex2DMS, ivec2(pos), 2);
|
||||
col += 0.125f * texelFetch(tex2DMS, ivec2(pos), 3);
|
||||
col += 0.125f * texelFetch(tex2DMS, ivec2(pos), 4);
|
||||
col += 0.125f * texelFetch(tex2DMS, ivec2(pos), 5);
|
||||
col += 0.125f * texelFetch(tex2DMS, ivec2(pos), 6);
|
||||
col += 0.125f * texelFetch(tex2DMS, ivec2(pos), 7);
|
||||
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), 0);
|
||||
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos), 1);
|
||||
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos), 2);
|
||||
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos), 3);
|
||||
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos), 4);
|
||||
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos), 5);
|
||||
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos), 6);
|
||||
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos), 7);
|
||||
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos), 8);
|
||||
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos), 9);
|
||||
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos), 10);
|
||||
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos), 11);
|
||||
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos), 12);
|
||||
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos), 13);
|
||||
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos), 14);
|
||||
col += 0.0625f * texelFetch(tex2DMS, ivec2(pos), 15);
|
||||
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), sampleIdx);
|
||||
col = texelFetch(tex2DMS, ivec2(pos * texRes.xy), sampleIdx);
|
||||
}
|
||||
}
|
||||
else if(type == RESTYPE_TEX2DARRAY)
|
||||
{
|
||||
ivec3 size = textureSize(tex2DArray, mipLevel);
|
||||
|
||||
col = textureLod(tex2DArray, vec3(pos / size.xy, slice), float(mipLevel));
|
||||
col = textureLod(tex2DArray, vec3(pos, slice), float(mipLevel));
|
||||
}
|
||||
else if(type == RESTYPE_TEX3D)
|
||||
{
|
||||
ivec3 size = textureSize(tex3D, mipLevel);
|
||||
|
||||
col = textureLod(tex3D, vec3(pos / size.xy, slice / size.z), float(mipLevel));
|
||||
col = textureLod(tex3D, vec3(pos, slice / texRes.z), float(mipLevel));
|
||||
}
|
||||
else if(type == RESTYPE_TEXCUBE)
|
||||
{
|
||||
ivec2 size = textureSize(texCube, mipLevel);
|
||||
|
||||
vec3 cubeCoord = CalcCubeCoord(pos / size, int(slice));
|
||||
vec3 cubeCoord = CalcCubeCoord(pos, int(slice));
|
||||
|
||||
col = textureLod(texCube, cubeCoord, float(mipLevel));
|
||||
}
|
||||
else // type == RESTYPE_TEXCUBEARRAY
|
||||
{
|
||||
ivec3 size = textureSize(texCubeArray, mipLevel);
|
||||
|
||||
vec3 cubeCoord = CalcCubeCoord(pos / size.xy, int(slice) % 6);
|
||||
vec3 cubeCoord = CalcCubeCoord(pos, int(slice) % 6);
|
||||
vec4 arrayCoord = vec4(cubeCoord, int(slice) / 6);
|
||||
|
||||
col = textureLod(texCubeArray, arrayCoord, float(mipLevel));
|
||||
|
||||
@@ -54,7 +54,7 @@ void main()
|
||||
|
||||
#if UINT_TEX
|
||||
{
|
||||
uvec4 data = SampleTextureUInt4(texType, vec2(x, y),
|
||||
uvec4 data = SampleTextureUInt4(texType, vec2(x, y) / histogram_minmax.HistogramTextureResolution.xy,
|
||||
histogram_minmax.HistogramSlice,
|
||||
histogram_minmax.HistogramMip,
|
||||
histogram_minmax.HistogramSample,
|
||||
@@ -97,7 +97,7 @@ void main()
|
||||
}
|
||||
#elif SINT_TEX
|
||||
{
|
||||
ivec4 data = SampleTextureSInt4(texType, vec2(x, y),
|
||||
ivec4 data = SampleTextureSInt4(texType, vec2(x, y) / histogram_minmax.HistogramTextureResolution.xy,
|
||||
histogram_minmax.HistogramSlice,
|
||||
histogram_minmax.HistogramMip,
|
||||
histogram_minmax.HistogramSample,
|
||||
@@ -140,7 +140,7 @@ void main()
|
||||
}
|
||||
#else
|
||||
{
|
||||
vec4 data = SampleTextureFloat4(texType, vec2(x, y),
|
||||
vec4 data = SampleTextureFloat4(texType, vec2(x, y) / histogram_minmax.HistogramTextureResolution.xy,
|
||||
histogram_minmax.HistogramSlice,
|
||||
histogram_minmax.HistogramMip,
|
||||
histogram_minmax.HistogramSample,
|
||||
|
||||
@@ -63,7 +63,7 @@ void main()
|
||||
{
|
||||
for(uint x=topleft.x; x < min(texDim.x, topleft.x + HGRAM_PIXELS_PER_TILE); x++)
|
||||
{
|
||||
uvec4 data = SampleTextureUInt4(texType, vec2(x, y),
|
||||
uvec4 data = SampleTextureUInt4(texType, vec2(x, y) / histogram_minmax.HistogramTextureResolution.xy,
|
||||
histogram_minmax.HistogramSlice,
|
||||
histogram_minmax.HistogramMip,
|
||||
histogram_minmax.HistogramSample,
|
||||
@@ -95,7 +95,7 @@ void main()
|
||||
{
|
||||
for(uint x=topleft.x; x < min(texDim.x, topleft.x + HGRAM_PIXELS_PER_TILE); x++)
|
||||
{
|
||||
ivec4 data = SampleTextureSInt4(texType, vec2(x, y),
|
||||
ivec4 data = SampleTextureSInt4(texType, vec2(x, y) / histogram_minmax.HistogramTextureResolution.xy,
|
||||
histogram_minmax.HistogramSlice,
|
||||
histogram_minmax.HistogramMip,
|
||||
histogram_minmax.HistogramSample,
|
||||
@@ -127,7 +127,7 @@ void main()
|
||||
{
|
||||
for(uint x=topleft.x; x < min(texDim.x, topleft.x + HGRAM_PIXELS_PER_TILE); x++)
|
||||
{
|
||||
vec4 data = SampleTextureFloat4(texType, vec2(x, y),
|
||||
vec4 data = SampleTextureFloat4(texType, vec2(x, y) / histogram_minmax.HistogramTextureResolution.xy,
|
||||
histogram_minmax.HistogramSlice,
|
||||
histogram_minmax.HistogramMip,
|
||||
histogram_minmax.HistogramSample,
|
||||
|
||||
@@ -69,8 +69,13 @@ void main(void)
|
||||
|
||||
scr -= texdisplay.Position.xy;
|
||||
|
||||
scr /= texdisplay.TextureResolutionPS.xy;
|
||||
|
||||
scr /= texdisplay.Scale;
|
||||
|
||||
scr /= vec2(texdisplay.MipShift, texdisplay.MipShift);
|
||||
vec2 scr2 = scr;
|
||||
|
||||
#ifdef VULKAN
|
||||
if(texType == RESTYPE_TEX1D)
|
||||
#else
|
||||
@@ -78,13 +83,13 @@ void main(void)
|
||||
#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)
|
||||
if(scr2.x < 0.0f || scr2.x > 1.0f || scr2.y < 0.0f || scr2.y > 100.0f)
|
||||
discard;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(scr.x < 0.0f || scr.y < 0.0f ||
|
||||
scr.x > texdisplay.TextureResolutionPS.x || scr.y > texdisplay.TextureResolutionPS.y)
|
||||
if(scr2.x < 0.0f || scr2.y < 0.0f ||
|
||||
scr2.x > 1.0f || scr2.y > 1.0f)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
@@ -97,7 +102,7 @@ void main(void)
|
||||
#endif
|
||||
|
||||
if (texdisplay.FlipY != defaultFlipY)
|
||||
scr.y = texdisplay.TextureResolutionPS.y - scr.y;
|
||||
scr.y = 1.0f - scr.y;
|
||||
|
||||
if(uintTex)
|
||||
{
|
||||
|
||||
@@ -22,26 +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;
|
||||
}
|
||||
// these bindings are defined based on the RESTYPE_ defines in debuguniforms.h
|
||||
|
||||
// binding = 5 + RESTYPE_x
|
||||
@@ -56,15 +36,15 @@ vec4 SampleTextureFloat4(int type, vec2 pos, float slice, int mipLevel, int samp
|
||||
|
||||
if(type == RESTYPE_TEX1D)
|
||||
{
|
||||
col = textureLod(tex1DArray, vec2(pos.x / texRes.x, slice), float(mipLevel));
|
||||
col = textureLod(tex1DArray, vec2(pos.x, slice), float(mipLevel));
|
||||
}
|
||||
else if(type == RESTYPE_TEX2D)
|
||||
{
|
||||
col = textureLod(tex2DArray, vec3(pos / texRes.xy, slice), float(mipLevel));
|
||||
col = textureLod(tex2DArray, vec3(pos, slice), float(mipLevel));
|
||||
}
|
||||
else if(type == RESTYPE_TEX3D)
|
||||
{
|
||||
col = textureLod(tex3D, vec3(pos / texRes.xy, slice / texRes.z), float(mipLevel));
|
||||
col = textureLod(tex3D, vec3(pos, slice / texRes.z), float(mipLevel));
|
||||
}
|
||||
else if(type == RESTYPE_TEX2DMS)
|
||||
{
|
||||
@@ -79,13 +59,13 @@ vec4 SampleTextureFloat4(int type, vec2 pos, float slice, int mipLevel, int samp
|
||||
|
||||
// worst resolve you've seen in your life
|
||||
for(int i = 0; i < sampleCount; i++)
|
||||
col += texelFetch(tex2DMS, ivec2(pos), i);
|
||||
col += texelFetch(tex2DMS, ivec2(pos * texRes.xy), i);
|
||||
|
||||
col /= float(sampleCount);
|
||||
}
|
||||
else
|
||||
{
|
||||
col = texelFetch(tex2DMS, ivec2(pos), sampleIdx);
|
||||
col = texelFetch(tex2DMS, ivec2(pos * texRes.xy), sampleIdx);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -108,22 +88,22 @@ uvec4 SampleTextureUInt4(int type, vec2 pos, float slice, int mipLevel, int samp
|
||||
#ifndef NO_TEXEL_FETCH
|
||||
if(type == RESTYPE_TEX1D)
|
||||
{
|
||||
col = texelFetch(texUInt1DArray, ivec2(pos.x, slice), mipLevel);
|
||||
col = texelFetch(texUInt1DArray, ivec2(pos.x * texRes.x, slice), mipLevel);
|
||||
}
|
||||
else if(type == RESTYPE_TEX2D)
|
||||
{
|
||||
col = texelFetch(texUInt2DArray, ivec3(pos, slice), mipLevel);
|
||||
col = texelFetch(texUInt2DArray, ivec3(pos * texRes.xy, slice), mipLevel);
|
||||
}
|
||||
else if(type == RESTYPE_TEX3D)
|
||||
{
|
||||
col = texelFetch(texUInt3D, ivec3(pos, slice), mipLevel);
|
||||
col = texelFetch(texUInt3D, ivec3(pos * texRes.xy, slice), mipLevel);
|
||||
}
|
||||
else if(type == RESTYPE_TEX2DMS)
|
||||
{
|
||||
if(sampleIdx < 0)
|
||||
sampleIdx = 0;
|
||||
|
||||
col = texelFetch(texUInt2DMS, ivec2(pos), sampleIdx);
|
||||
col = texelFetch(texUInt2DMS, ivec2(pos * texRes.xy), sampleIdx);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -145,22 +125,22 @@ ivec4 SampleTextureSInt4(int type, vec2 pos, float slice, int mipLevel, int samp
|
||||
#ifndef NO_TEXEL_FETCH
|
||||
if(type == RESTYPE_TEX1D)
|
||||
{
|
||||
col = texelFetch(texSInt1DArray, ivec2(pos.x, slice), mipLevel);
|
||||
col = texelFetch(texSInt1DArray, ivec2(pos.x * texRes.x, slice), mipLevel);
|
||||
}
|
||||
else if(type == RESTYPE_TEX2D)
|
||||
{
|
||||
col = texelFetch(texSInt2DArray, ivec3(pos, slice), mipLevel);
|
||||
col = texelFetch(texSInt2DArray, ivec3(pos * texRes.xy, slice), mipLevel);
|
||||
}
|
||||
else if(type == RESTYPE_TEX3D)
|
||||
{
|
||||
col = texelFetch(texSInt3D, ivec3(pos, slice), mipLevel);
|
||||
col = texelFetch(texSInt3D, ivec3(pos * texRes.xy, slice), mipLevel);
|
||||
}
|
||||
else if(type == RESTYPE_TEX2DMS)
|
||||
{
|
||||
if(sampleIdx < 0)
|
||||
sampleIdx = 0;
|
||||
|
||||
col = texelFetch(texSInt2DMS, ivec2(pos), sampleIdx);
|
||||
col = texelFetch(texSInt2DMS, ivec2(pos * texRes.xy), sampleIdx);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1390,7 +1390,7 @@ void GLReplay::PickPixel(ResourceId texture, uint32_t x, uint32_t y, uint32_t sl
|
||||
texDisplay.offx = -float(x);
|
||||
texDisplay.offy = -float(y);
|
||||
|
||||
RenderTextureInternal(texDisplay, false);
|
||||
RenderTextureInternal(texDisplay, eTexDisplay_MipShift);
|
||||
|
||||
gl.glReadPixels(0, 0, 1, 1, eGL_RGBA, eGL_FLOAT, (void *)pixel);
|
||||
|
||||
@@ -1405,7 +1405,7 @@ void GLReplay::PickPixel(ResourceId texture, uint32_t x, uint32_t y, uint32_t sl
|
||||
{
|
||||
texDisplay.Red = texDisplay.Blue = texDisplay.Alpha = false;
|
||||
|
||||
RenderTextureInternal(texDisplay, false);
|
||||
RenderTextureInternal(texDisplay, eTexDisplay_MipShift);
|
||||
|
||||
uint32_t stencilpixel[4];
|
||||
gl.glReadPixels(0, 0, 1, 1, eGL_RGBA, eGL_FLOAT, (void *)stencilpixel);
|
||||
@@ -1491,11 +1491,14 @@ void GLReplay::CopyTex2DMSToArray(GLuint destArray, GLuint srcMS, GLint width, G
|
||||
|
||||
bool GLReplay::RenderTexture(TextureDisplay cfg)
|
||||
{
|
||||
return RenderTextureInternal(cfg, true);
|
||||
return RenderTextureInternal(cfg, eTexDisplay_BlendAlpha | eTexDisplay_MipShift);
|
||||
}
|
||||
|
||||
bool GLReplay::RenderTextureInternal(TextureDisplay cfg, bool blendAlpha)
|
||||
bool GLReplay::RenderTextureInternal(TextureDisplay cfg, int flags)
|
||||
{
|
||||
const bool blendAlpha = (flags & eTexDisplay_BlendAlpha) != 0;
|
||||
const bool mipShift = (flags & eTexDisplay_MipShift) != 0;
|
||||
|
||||
WrappedOpenGL &gl = *m_pDriver;
|
||||
|
||||
auto &texDetails = m_pDriver->m_Textures[cfg.texid];
|
||||
@@ -1781,16 +1784,14 @@ bool GLReplay::RenderTextureInternal(TextureDisplay cfg, bool blendAlpha)
|
||||
|
||||
ubo->RawOutput = cfg.rawoutput ? 1 : 0;
|
||||
|
||||
ubo->TextureResolutionPS.x = float(tex_x);
|
||||
ubo->TextureResolutionPS.y = float(tex_y);
|
||||
ubo->TextureResolutionPS.z = float(tex_z);
|
||||
ubo->TextureResolutionPS.x = float(RDCMAX(1, tex_x >> cfg.mip));
|
||||
ubo->TextureResolutionPS.y = float(RDCMAX(1, tex_y >> cfg.mip));
|
||||
ubo->TextureResolutionPS.z = float(RDCMAX(1, tex_z >> cfg.mip));
|
||||
|
||||
float mipScale = float(1 << cfg.mip);
|
||||
|
||||
ubo->Scale *= mipScale;
|
||||
ubo->TextureResolutionPS.x /= mipScale;
|
||||
ubo->TextureResolutionPS.y /= mipScale;
|
||||
ubo->TextureResolutionPS.z /= mipScale;
|
||||
if(mipShift)
|
||||
ubo->MipShift = float(1 << cfg.mip);
|
||||
else
|
||||
ubo->MipShift = 1.0f;
|
||||
|
||||
ubo->OutputRes.x = DebugData.outWidth;
|
||||
ubo->OutputRes.y = DebugData.outHeight;
|
||||
|
||||
@@ -2305,7 +2305,7 @@ byte *GLReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mip,
|
||||
|
||||
gl.glViewport(0, 0, width, height);
|
||||
|
||||
RenderTextureInternal(texDisplay, false);
|
||||
RenderTextureInternal(texDisplay, 0);
|
||||
}
|
||||
|
||||
DebugData.outWidth = oldW;
|
||||
@@ -2625,7 +2625,7 @@ ResourceId GLReplay::ApplyCustomShader(ResourceId shader, ResourceId texid, uint
|
||||
disp.scale = 1.0f;
|
||||
disp.sliceFace = arrayIdx;
|
||||
|
||||
RenderTextureInternal(disp, false);
|
||||
RenderTextureInternal(disp, eTexDisplay_MipShift);
|
||||
|
||||
return DebugData.CustomShaderTexID;
|
||||
}
|
||||
|
||||
@@ -169,8 +169,14 @@ public:
|
||||
ShaderStageType type, ResourceId *id, string *errors);
|
||||
void FreeCustomShader(ResourceId id);
|
||||
|
||||
enum TexDisplayFlags
|
||||
{
|
||||
eTexDisplay_BlendAlpha = 0x1,
|
||||
eTexDisplay_MipShift = 0x2,
|
||||
};
|
||||
|
||||
bool RenderTexture(TextureDisplay cfg);
|
||||
bool RenderTextureInternal(TextureDisplay cfg, bool blendAlpha);
|
||||
bool RenderTextureInternal(TextureDisplay cfg, int flags);
|
||||
|
||||
void RenderCheckerboard(Vec3f light, Vec3f dark);
|
||||
|
||||
|
||||
@@ -987,7 +987,7 @@ void VulkanReplay::PickPixel(ResourceId texture, uint32_t x, uint32_t y, uint32_
|
||||
&clearval,
|
||||
};
|
||||
|
||||
RenderTextureInternal(texDisplay, rpbegin, true);
|
||||
RenderTextureInternal(texDisplay, rpbegin, eTexDisplay_F32Render | eTexDisplay_MipShift);
|
||||
}
|
||||
|
||||
VkDevice dev = m_pDriver->GetDev();
|
||||
@@ -1110,12 +1110,15 @@ bool VulkanReplay::RenderTexture(TextureDisplay cfg)
|
||||
&clearval,
|
||||
};
|
||||
|
||||
return RenderTextureInternal(cfg, rpbegin, false);
|
||||
return RenderTextureInternal(cfg, rpbegin, eTexDisplay_MipShift | eTexDisplay_BlendAlpha);
|
||||
}
|
||||
|
||||
bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginInfo rpbegin,
|
||||
bool f32render)
|
||||
bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginInfo rpbegin, int flags)
|
||||
{
|
||||
const bool blendAlpha = (flags & eTexDisplay_BlendAlpha) != 0;
|
||||
const bool mipShift = (flags & eTexDisplay_MipShift) != 0;
|
||||
const bool f32render = (flags & eTexDisplay_F32Render) != 0;
|
||||
|
||||
VkDevice dev = m_pDriver->GetDev();
|
||||
VkCommandBuffer cmd = m_pDriver->GetNextCmd();
|
||||
const VkLayerDispatchTable *vt = ObjDisp(dev);
|
||||
@@ -1227,13 +1230,16 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn
|
||||
else
|
||||
data->Slice = (float)(cfg.sliceFace >> cfg.mip);
|
||||
|
||||
float mipScale = float(1 << cfg.mip);
|
||||
data->TextureResolutionPS.x = float(RDCMAX(1, tex_x >> cfg.mip));
|
||||
data->TextureResolutionPS.y = float(RDCMAX(1, tex_y >> cfg.mip));
|
||||
data->TextureResolutionPS.z = float(RDCMAX(1, tex_z >> cfg.mip));
|
||||
|
||||
data->TextureResolutionPS.x = float(tex_x) / mipScale;
|
||||
data->TextureResolutionPS.y = float(tex_y) / mipScale;
|
||||
data->TextureResolutionPS.z = float(tex_z) / mipScale;
|
||||
if(mipShift)
|
||||
data->MipShift = float(1 << cfg.mip);
|
||||
else
|
||||
data->MipShift = 1.0f;
|
||||
|
||||
data->Scale = cfg.scale * mipScale;
|
||||
data->Scale = cfg.scale;
|
||||
|
||||
int sampleIdx = (int)RDCCLAMP(cfg.sampleIdx, 0U, (uint32_t)SampleCount(iminfo.samples));
|
||||
|
||||
@@ -1389,7 +1395,7 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn
|
||||
{
|
||||
pipe = GetDebugManager()->m_TexDisplayF32Pipeline;
|
||||
}
|
||||
else if(!cfg.rawoutput && cfg.CustomShader == ResourceId())
|
||||
else if(!cfg.rawoutput && blendAlpha && cfg.CustomShader == ResourceId())
|
||||
{
|
||||
pipe = GetDebugManager()->m_TexDisplayBlendPipeline;
|
||||
}
|
||||
@@ -4816,7 +4822,7 @@ byte *VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t m
|
||||
&clearval,
|
||||
};
|
||||
|
||||
RenderTextureInternal(texDisplay, rpbegin, false);
|
||||
RenderTextureInternal(texDisplay, rpbegin, 0);
|
||||
}
|
||||
|
||||
m_DebugWidth = oldW;
|
||||
@@ -5438,7 +5444,7 @@ ResourceId VulkanReplay::ApplyCustomShader(ResourceId shader, ResourceId texid,
|
||||
&clearval,
|
||||
};
|
||||
|
||||
RenderTextureInternal(disp, rpbegin, false);
|
||||
RenderTextureInternal(disp, rpbegin, eTexDisplay_MipShift);
|
||||
|
||||
m_DebugWidth = oldW;
|
||||
m_DebugHeight = oldH;
|
||||
|
||||
@@ -331,7 +331,14 @@ private:
|
||||
|
||||
WrappedVulkan *m_pDriver;
|
||||
|
||||
bool RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginInfo rpbegin, bool f32render);
|
||||
enum TexDisplayFlags
|
||||
{
|
||||
eTexDisplay_F32Render = 0x1,
|
||||
eTexDisplay_BlendAlpha = 0x2,
|
||||
eTexDisplay_MipShift = 0x4,
|
||||
};
|
||||
|
||||
bool RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginInfo rpbegin, int flags);
|
||||
|
||||
void CreateTexImageView(VkImageAspectFlags aspectFlags, VkImage liveIm,
|
||||
VulkanCreationInfo::Image &iminfo);
|
||||
|
||||
Reference in New Issue
Block a user