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/14988
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/common/Image.cpp b/src/OpenGL/common/Image.cpp
index fe57b93..9fab82e 100644
--- a/src/OpenGL/common/Image.cpp
+++ b/src/OpenGL/common/Image.cpp
@@ -868,7 +868,7 @@
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 @@
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);
}
diff --git a/src/OpenGL/libGLESv2/Device.cpp b/src/OpenGL/libGLESv2/Device.cpp
index cb2f49f..6bbb4ac 100644
--- a/src/OpenGL/libGLESv2/Device.cpp
+++ b/src/OpenGL/libGLESv2/Device.cpp
@@ -261,6 +261,7 @@
switch(format)
{
+ case FORMAT_S8:
// case FORMAT_D15S1:
case FORMAT_D24S8:
case FORMAT_D24X8:
diff --git a/src/OpenGL/libGLESv2/Renderbuffer.cpp b/src/OpenGL/libGLESv2/Renderbuffer.cpp
index f1f6faa..61cc223 100644
--- a/src/OpenGL/libGLESv2/Renderbuffer.cpp
+++ b/src/OpenGL/libGLESv2/Renderbuffer.cpp
@@ -528,23 +528,13 @@
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;
diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp
index b784a4a..e4f54ed 100644
--- a/src/OpenGL/libGLESv2/utilities.cpp
+++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -2246,21 +2246,13 @@
{
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);
}
diff --git a/src/Renderer/Blitter.cpp b/src/Renderer/Blitter.cpp
index 810f3cd..a6773fc 100644
--- a/src/Renderer/Blitter.cpp
+++ b/src/Renderer/Blitter.cpp
@@ -400,18 +400,15 @@
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 @@
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 @@
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);
diff --git a/src/Renderer/Surface.cpp b/src/Renderer/Surface.cpp
index d836614..b15102d 100644
--- a/src/Renderer/Surface.cpp
+++ b/src/Renderer/Surface.cpp
@@ -318,12 +318,15 @@
((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 @@
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 @@
a = r;
break;
case FORMAT_D32F_COMPLEMENTARY:
+ case FORMAT_D32FS8_COMPLEMENTARY:
r = 1.0f - *(float*)element;
g = r;
b = r;
@@ -1213,7 +1219,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
return true;
case FORMAT_D32F_LOCKABLE:
case FORMAT_D32FS8_TEXTURE:
+ case FORMAT_D32F_SHADOW:
case FORMAT_D32FS8_SHADOW:
default:
break;
@@ -2823,9 +2841,12 @@
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 @@
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 @@
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 @@
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,11 +3894,9 @@
case FORMAT_D16:
case FORMAT_D32:
case FORMAT_D24X8:
- case FORMAT_D24S8:
- case FORMAT_D24FS8:
if(hasParent) // Texture
{
- return FORMAT_D32FS8_SHADOW;
+ return FORMAT_D32F_SHADOW;
}
else if(complementaryDepthBuffer)
{
@@ -3884,12 +3906,29 @@
{
return FORMAT_D32F;
}
+ case FORMAT_D24S8:
+ case FORMAT_D24FS8:
+ if(hasParent) // Texture
+ {
+ return FORMAT_D32FS8_SHADOW;
+ }
+ else if(complementaryDepthBuffer)
+ {
+ return FORMAT_D32FS8_COMPLEMENTARY;
+ }
+ else
+ {
+ 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;
diff --git a/src/Renderer/Surface.hpp b/src/Renderer/Surface.hpp
index 02be486..16aa24e 100644
--- a/src/Renderer/Surface.hpp
+++ b/src/Renderer/Surface.hpp
@@ -201,9 +201,12 @@
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,
diff --git a/src/Shader/SamplerCore.cpp b/src/Shader/SamplerCore.cpp
index 942cf87..a50c1e8 100644
--- a/src/Shader/SamplerCore.cpp
+++ b/src/Shader/SamplerCore.cpp
@@ -263,8 +263,10 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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;