Commit 57e7cea7 by Nicolas Capens Committed by Nicolas Capens

Implement missing depth/stencil formats.

Several depth-only formats were implemented using depth+stencil formats. This resulted in unintended stencil operations happening, as well as unnecessary allocations and blitting of stencil data. This change also introduces quad-layout depth+stencil formats for more efficient rendering. Note that as before the 'internal' buffer's format also indicates the presence of a stencil component, even though it only stores the depth component, while the 'stencil' buffer now has an S8 format or NULL for a depth-only format. Change-Id: I245f0cb5a999851e24082f3ab1ea78a5f5956af3 Reviewed-on: https://swiftshader-review.googlesource.com/14988Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 8536a44a
......@@ -868,7 +868,7 @@ namespace egl
return sw::FORMAT_A16B16G16R16UI;
case GL_DEPTH_COMPONENT:
case GL_DEPTH_COMPONENT16:
return sw::FORMAT_D32FS8_TEXTURE;
return sw::FORMAT_D32F_LOCKABLE;
default:
UNREACHABLE(format);
}
......@@ -909,7 +909,7 @@ namespace egl
case GL_DEPTH_COMPONENT16:
case GL_DEPTH_COMPONENT24:
case GL_DEPTH_COMPONENT32_OES:
return sw::FORMAT_D32FS8_TEXTURE;
return sw::FORMAT_D32F_LOCKABLE;
default:
UNREACHABLE(format);
}
......
......@@ -261,6 +261,7 @@ namespace es2
switch(format)
{
case FORMAT_S8:
// case FORMAT_D15S1:
case FORMAT_D24S8:
case FORMAT_D24X8:
......
......@@ -528,23 +528,13 @@ DepthStencilbuffer::DepthStencilbuffer(int width, int height, GLenum internalfor
sw::Format implementationFormat = sw::FORMAT_D24S8;
switch(internalformat)
{
case GL_STENCIL_INDEX8:
case GL_DEPTH_COMPONENT24:
case GL_DEPTH24_STENCIL8_OES:
implementationFormat = sw::FORMAT_D24S8;
break;
case GL_DEPTH32F_STENCIL8:
implementationFormat = sw::FORMAT_D32FS8_TEXTURE;
break;
case GL_DEPTH_COMPONENT16:
implementationFormat = sw::FORMAT_D16;
break;
case GL_DEPTH_COMPONENT32_OES:
implementationFormat = sw::FORMAT_D32;
break;
case GL_DEPTH_COMPONENT32F:
implementationFormat = sw::FORMAT_D32F;
break;
case GL_STENCIL_INDEX8: implementationFormat = sw::FORMAT_S8; break;
case GL_DEPTH_COMPONENT24: implementationFormat = sw::FORMAT_D24X8; break;
case GL_DEPTH24_STENCIL8_OES: implementationFormat = sw::FORMAT_D24S8; break;
case GL_DEPTH32F_STENCIL8: implementationFormat = sw::FORMAT_D32FS8; break;
case GL_DEPTH_COMPONENT16: implementationFormat = sw::FORMAT_D16; break;
case GL_DEPTH_COMPONENT32_OES: implementationFormat = sw::FORMAT_D32; break;
case GL_DEPTH_COMPONENT32F: implementationFormat = sw::FORMAT_D32F; break;
default:
UNREACHABLE(internalformat);
format = GL_DEPTH24_STENCIL8_OES;
......
......@@ -2246,21 +2246,13 @@ namespace sw2es
{
switch(format)
{
case sw::FORMAT_D16:
case sw::FORMAT_D24X8:
case sw::FORMAT_D32:
return GL_DEPTH_COMPONENT16;
case sw::FORMAT_D24S8:
return GL_DEPTH24_STENCIL8_OES;
case sw::FORMAT_D32F:
case sw::FORMAT_D32F_COMPLEMENTARY:
case sw::FORMAT_D32F_LOCKABLE:
return GL_DEPTH_COMPONENT32F;
case sw::FORMAT_D32FS8_TEXTURE:
case sw::FORMAT_D32FS8_SHADOW:
return GL_DEPTH32F_STENCIL8;
case sw::FORMAT_S8:
return GL_STENCIL_INDEX8;
case sw::FORMAT_D16: return GL_DEPTH_COMPONENT16;
case sw::FORMAT_D24X8: return GL_DEPTH_COMPONENT24;
case sw::FORMAT_D32: return GL_DEPTH_COMPONENT32_OES;
case sw::FORMAT_D24S8: return GL_DEPTH24_STENCIL8_OES;
case sw::FORMAT_D32F: return GL_DEPTH_COMPONENT32F;
case sw::FORMAT_D32FS8: return GL_DEPTH32F_STENCIL8;
case sw::FORMAT_S8: return GL_STENCIL_INDEX8;
default:
UNREACHABLE(format);
}
......
......@@ -400,18 +400,15 @@ namespace sw
case FORMAT_D32:
c.x = Float(Int((*Pointer<UInt>(element))));
break;
case FORMAT_D32F:
c.x = *Pointer<Float>(element);
break;
case FORMAT_D32F_COMPLEMENTARY:
case FORMAT_D32FS8_COMPLEMENTARY:
c.x = 1.0f - *Pointer<Float>(element);
break;
case FORMAT_D32F:
case FORMAT_D32FS8:
case FORMAT_D32F_LOCKABLE:
c.x = *Pointer<Float>(element);
break;
case FORMAT_D32FS8_TEXTURE:
c.x = *Pointer<Float>(element);
break;
case FORMAT_D32F_SHADOW:
case FORMAT_D32FS8_SHADOW:
c.x = *Pointer<Float>(element);
break;
......@@ -767,18 +764,15 @@ namespace sw
case FORMAT_D32:
*Pointer<UInt>(element) = UInt(RoundInt(Float(c.x)));
break;
case FORMAT_D32F:
*Pointer<Float>(element) = c.x;
break;
case FORMAT_D32F_COMPLEMENTARY:
case FORMAT_D32FS8_COMPLEMENTARY:
*Pointer<Float>(element) = 1.0f - c.x;
break;
case FORMAT_D32F:
case FORMAT_D32FS8:
case FORMAT_D32F_LOCKABLE:
*Pointer<Float>(element) = c.x;
break;
case FORMAT_D32FS8_TEXTURE:
*Pointer<Float>(element) = c.x;
break;
case FORMAT_D32F_SHADOW:
case FORMAT_D32FS8_SHADOW:
*Pointer<Float>(element) = c.x;
break;
......@@ -1064,9 +1058,12 @@ namespace sw
scale = vector(static_cast<float>(0xFFFFFFFF), 0.0f, 0.0f, 0.0f);
break;
case FORMAT_D32F:
case FORMAT_D32FS8:
case FORMAT_D32F_COMPLEMENTARY:
case FORMAT_D32FS8_COMPLEMENTARY:
case FORMAT_D32F_LOCKABLE:
case FORMAT_D32FS8_TEXTURE:
case FORMAT_D32F_SHADOW:
case FORMAT_D32FS8_SHADOW:
case FORMAT_S8:
scale = vector(1.0f, 1.0f, 1.0f, 1.0f);
......
......@@ -318,12 +318,15 @@ namespace sw
((float*)element)[3] = color.a;
break;
case FORMAT_D32F:
case FORMAT_D32FS8:
case FORMAT_D32F_LOCKABLE:
case FORMAT_D32FS8_TEXTURE:
case FORMAT_D32F_SHADOW:
case FORMAT_D32FS8_SHADOW:
*((float*)element) = color.r;
break;
case FORMAT_D32F_COMPLEMENTARY:
case FORMAT_D32FS8_COMPLEMENTARY:
*((float*)element) = 1 - color.r;
break;
case FORMAT_S8:
......@@ -962,8 +965,10 @@ namespace sw
a = ((float*)element)[3];
break;
case FORMAT_D32F:
case FORMAT_D32FS8:
case FORMAT_D32F_LOCKABLE:
case FORMAT_D32FS8_TEXTURE:
case FORMAT_D32F_SHADOW:
case FORMAT_D32FS8_SHADOW:
r = *(float*)element;
g = r;
......@@ -971,6 +976,7 @@ namespace sw
a = r;
break;
case FORMAT_D32F_COMPLEMENTARY:
case FORMAT_D32FS8_COMPLEMENTARY:
r = 1.0f - *(float*)element;
g = r;
b = r;
......@@ -1213,7 +1219,7 @@ namespace sw
external.lock = LOCK_UNLOCKED;
external.dirty = true;
internal.buffer = 0;
internal.buffer = nullptr;
internal.width = width;
internal.height = height;
internal.depth = depth;
......@@ -1227,11 +1233,11 @@ namespace sw
internal.lock = LOCK_UNLOCKED;
internal.dirty = false;
stencil.buffer = 0;
stencil.buffer = nullptr;
stencil.width = width;
stencil.height = height;
stencil.depth = depth;
stencil.format = FORMAT_S8;
stencil.format = isStencil(format) ? FORMAT_S8 : FORMAT_NULL;
stencil.bytes = bytes(stencil.format);
stencil.pitchB = pitchB(stencil.width, 0, stencil.format, false);
stencil.pitchP = pitchP(stencil.width, 0, stencil.format, false);
......@@ -1248,11 +1254,11 @@ namespace sw
Surface::Surface(Resource *texture, int width, int height, int depth, int border, Format format, bool lockable, bool renderTarget, int pitchPprovided) : lockable(lockable), renderTarget(renderTarget)
{
resource = texture ? texture : new Resource(0);
hasParent = texture != 0;
hasParent = texture != nullptr;
ownExternal = true;
depth = max(1, depth);
external.buffer = 0;
external.buffer = nullptr;
external.width = width;
external.height = height;
external.depth = depth;
......@@ -1266,7 +1272,7 @@ namespace sw
external.lock = LOCK_UNLOCKED;
external.dirty = false;
internal.buffer = 0;
internal.buffer = nullptr;
internal.width = width;
internal.height = height;
internal.depth = depth;
......@@ -1280,11 +1286,11 @@ namespace sw
internal.lock = LOCK_UNLOCKED;
internal.dirty = false;
stencil.buffer = 0;
stencil.buffer = nullptr;
stencil.width = width;
stencil.height = height;
stencil.depth = depth;
stencil.format = FORMAT_S8;
stencil.format = isStencil(format) ? FORMAT_S8 : FORMAT_NULL;
stencil.bytes = bytes(stencil.format);
stencil.pitchB = pitchB(stencil.width, 0, stencil.format, renderTarget);
stencil.pitchP = pitchP(stencil.width, 0, stencil.format, renderTarget);
......@@ -1623,9 +1629,12 @@ namespace sw
case FORMAT_D24S8: return 4;
case FORMAT_D24FS8: return 4;
case FORMAT_D32F: return 4;
case FORMAT_D32FS8: return 4;
case FORMAT_D32F_COMPLEMENTARY: return 4;
case FORMAT_D32FS8_COMPLEMENTARY: return 4;
case FORMAT_D32F_LOCKABLE: return 4;
case FORMAT_D32FS8_TEXTURE: return 4;
case FORMAT_D32F_SHADOW: return 4;
case FORMAT_D32FS8_SHADOW: return 4;
case FORMAT_DF24S8: return 4;
case FORMAT_DF16S8: return 2;
......@@ -2672,6 +2681,7 @@ namespace sw
case FORMAT_D32F:
case FORMAT_D32F_COMPLEMENTARY:
case FORMAT_D32F_LOCKABLE:
case FORMAT_D32F_SHADOW:
return false;
case FORMAT_D24S8:
case FORMAT_D24FS8:
......@@ -2680,6 +2690,8 @@ namespace sw
case FORMAT_DF16S8:
case FORMAT_D32FS8_TEXTURE:
case FORMAT_D32FS8_SHADOW:
case FORMAT_D32FS8:
case FORMAT_D32FS8_COMPLEMENTARY:
case FORMAT_INTZ:
return true;
default:
......@@ -2697,11 +2709,14 @@ namespace sw
case FORMAT_D24S8:
case FORMAT_D24FS8:
case FORMAT_D32F:
case FORMAT_D32FS8:
case FORMAT_D32F_COMPLEMENTARY:
case FORMAT_D32FS8_COMPLEMENTARY:
case FORMAT_D32F_LOCKABLE:
case FORMAT_DF24S8:
case FORMAT_DF16S8:
case FORMAT_D32FS8_TEXTURE:
case FORMAT_D32F_SHADOW:
case FORMAT_D32FS8_SHADOW:
case FORMAT_INTZ:
return true;
......@@ -2722,7 +2737,9 @@ namespace sw
case FORMAT_D24S8:
case FORMAT_D24FS8:
case FORMAT_D32F:
case FORMAT_D32FS8:
case FORMAT_D32F_COMPLEMENTARY:
case FORMAT_D32FS8_COMPLEMENTARY:
case FORMAT_DF24S8:
case FORMAT_DF16S8:
case FORMAT_INTZ:
......@@ -2732,6 +2749,7 @@ namespace sw
return true;
case FORMAT_D32F_LOCKABLE:
case FORMAT_D32FS8_TEXTURE:
case FORMAT_D32F_SHADOW:
case FORMAT_D32FS8_SHADOW:
default:
break;
......@@ -2823,9 +2841,12 @@ namespace sw
case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F:
case FORMAT_D32F:
case FORMAT_D32FS8:
case FORMAT_D32F_COMPLEMENTARY:
case FORMAT_D32FS8_COMPLEMENTARY:
case FORMAT_D32F_LOCKABLE:
case FORMAT_D32FS8_TEXTURE:
case FORMAT_D32F_SHADOW:
case FORMAT_D32FS8_SHADOW:
case FORMAT_L16F:
case FORMAT_A16L16F:
......@@ -2870,9 +2891,12 @@ namespace sw
case FORMAT_X8B8G8R8UI:
case FORMAT_A8B8G8R8UI:
case FORMAT_D32F:
case FORMAT_D32FS8:
case FORMAT_D32F_COMPLEMENTARY:
case FORMAT_D32FS8_COMPLEMENTARY:
case FORMAT_D32F_LOCKABLE:
case FORMAT_D32FS8_TEXTURE:
case FORMAT_D32F_SHADOW:
case FORMAT_D32FS8_SHADOW:
case FORMAT_A8:
case FORMAT_R8:
......@@ -3135,8 +3159,10 @@ namespace sw
case FORMAT_X32B32G32R32F: return 3;
case FORMAT_A32B32G32R32F: return 4;
case FORMAT_D32F: return 1;
case FORMAT_D32FS8: return 1;
case FORMAT_D32F_LOCKABLE: return 1;
case FORMAT_D32FS8_TEXTURE: return 1;
case FORMAT_D32F_SHADOW: return 1;
case FORMAT_D32FS8_SHADOW: return 1;
case FORMAT_A8: return 1;
case FORMAT_R8I: return 1;
......@@ -3278,9 +3304,7 @@ namespace sw
int x1 = x0 + width;
int y1 = y0 + height;
if(internal.format == FORMAT_D32F_LOCKABLE ||
internal.format == FORMAT_D32FS8_TEXTURE ||
internal.format == FORMAT_D32FS8_SHADOW)
if(!hasQuadLayout(internal.format))
{
float *target = (float*)lockInternal(0, 0, 0, lock, PUBLIC) + x0 + width2 * y0;
......@@ -3870,6 +3894,18 @@ namespace sw
case FORMAT_D16:
case FORMAT_D32:
case FORMAT_D24X8:
if(hasParent) // Texture
{
return FORMAT_D32F_SHADOW;
}
else if(complementaryDepthBuffer)
{
return FORMAT_D32F_COMPLEMENTARY;
}
else
{
return FORMAT_D32F;
}
case FORMAT_D24S8:
case FORMAT_D24FS8:
if(hasParent) // Texture
......@@ -3878,18 +3914,21 @@ namespace sw
}
else if(complementaryDepthBuffer)
{
return FORMAT_D32F_COMPLEMENTARY;
return FORMAT_D32FS8_COMPLEMENTARY;
}
else
{
return FORMAT_D32F;
return FORMAT_D32FS8;
}
case FORMAT_D32F: return FORMAT_D32F;
case FORMAT_D32FS8: return FORMAT_D32FS8;
case FORMAT_D32F_LOCKABLE: return FORMAT_D32F_LOCKABLE;
case FORMAT_D32FS8_TEXTURE: return FORMAT_D32FS8_TEXTURE;
case FORMAT_INTZ: return FORMAT_D32FS8_TEXTURE;
case FORMAT_DF24S8: return FORMAT_D32FS8_SHADOW;
case FORMAT_DF16S8: return FORMAT_D32FS8_SHADOW;
case FORMAT_S8: return FORMAT_S8;
// YUV formats
case FORMAT_YV12_BT601: return FORMAT_YV12_BT601;
case FORMAT_YV12_BT709: return FORMAT_YV12_BT709;
case FORMAT_YV12_JFIF: return FORMAT_YV12_JFIF;
......
......@@ -201,9 +201,12 @@ namespace sw
FORMAT_D24S8,
FORMAT_D24FS8,
FORMAT_D32F, // Quad layout
FORMAT_D32FS8, // Quad layout
FORMAT_D32F_COMPLEMENTARY, // Quad layout, 1 - z
FORMAT_D32FS8_COMPLEMENTARY, // Quad layout, 1 - z
FORMAT_D32F_LOCKABLE, // Linear layout
FORMAT_D32FS8_TEXTURE, // Linear layout, no PCF
FORMAT_D32F_SHADOW, // Linear layout, PCF
FORMAT_D32FS8_SHADOW, // Linear layout, PCF
FORMAT_DF24S8,
FORMAT_DF16S8,
......
......@@ -263,8 +263,10 @@ namespace sw
case FORMAT_A32B32G32R32F:
break;
case FORMAT_D32F:
case FORMAT_D32FS8:
case FORMAT_D32F_LOCKABLE:
case FORMAT_D32FS8_TEXTURE:
case FORMAT_D32F_SHADOW:
case FORMAT_D32FS8_SHADOW:
c.y = c.x;
c.z = c.x;
......@@ -518,8 +520,10 @@ namespace sw
case FORMAT_A32B32G32R32F:
break;
case FORMAT_D32F:
case FORMAT_D32FS8:
case FORMAT_D32F_LOCKABLE:
case FORMAT_D32FS8_TEXTURE:
case FORMAT_D32F_SHADOW:
case FORMAT_D32FS8_SHADOW:
c.y = Float4(0.0f);
c.z = Float4(0.0f);
......@@ -2657,8 +2661,10 @@ namespace sw
case FORMAT_L8:
case FORMAT_A8L8:
case FORMAT_D32F:
case FORMAT_D32FS8:
case FORMAT_D32F_LOCKABLE:
case FORMAT_D32FS8_TEXTURE:
case FORMAT_D32F_SHADOW:
case FORMAT_D32FS8_SHADOW:
case FORMAT_L16:
case FORMAT_G16R16:
......@@ -2722,8 +2728,10 @@ namespace sw
case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F:
case FORMAT_D32F:
case FORMAT_D32FS8:
case FORMAT_D32F_LOCKABLE:
case FORMAT_D32FS8_TEXTURE:
case FORMAT_D32F_SHADOW:
case FORMAT_D32FS8_SHADOW:
case FORMAT_L16:
case FORMAT_G16R16:
......@@ -2802,8 +2810,10 @@ namespace sw
case FORMAT_L8:
case FORMAT_A8L8:
case FORMAT_D32F:
case FORMAT_D32FS8:
case FORMAT_D32F_LOCKABLE:
case FORMAT_D32FS8_TEXTURE:
case FORMAT_D32F_SHADOW:
case FORMAT_D32FS8_SHADOW:
case FORMAT_YV12_BT601:
case FORMAT_YV12_BT709:
......@@ -2881,8 +2891,10 @@ namespace sw
case FORMAT_L8:
case FORMAT_A8L8:
case FORMAT_D32F:
case FORMAT_D32FS8:
case FORMAT_D32F_LOCKABLE:
case FORMAT_D32FS8_TEXTURE:
case FORMAT_D32F_SHADOW:
case FORMAT_D32FS8_SHADOW:
case FORMAT_YV12_BT601:
case FORMAT_YV12_BT709:
......@@ -2952,8 +2964,10 @@ namespace sw
case FORMAT_L8:
case FORMAT_A8L8:
case FORMAT_D32F:
case FORMAT_D32FS8:
case FORMAT_D32F_LOCKABLE:
case FORMAT_D32FS8_TEXTURE:
case FORMAT_D32F_SHADOW:
case FORMAT_D32FS8_SHADOW:
case FORMAT_L16:
case FORMAT_G16R16:
......@@ -3021,8 +3035,10 @@ namespace sw
case FORMAT_L8: return component < 1;
case FORMAT_A8L8: return component < 1;
case FORMAT_D32F: return false;
case FORMAT_D32FS8: return false;
case FORMAT_D32F_LOCKABLE: return false;
case FORMAT_D32FS8_TEXTURE: return false;
case FORMAT_D32F_SHADOW: return false;
case FORMAT_D32FS8_SHADOW: return false;
case FORMAT_L16: return component < 1;
case FORMAT_G16R16: return component < 2;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment