Adding functionality to stencils
Two minor features are required for the blitFramebuffer
implementation in OpenGL ES 3:
- lockStencil with x,y coordinates
- getting the stencil format (new getStencilFormat function)
Change-Id: I83ccccefe70dbbedd05b5d82bc75d30f689c4abe
Reviewed-on: https://swiftshader-review.googlesource.com/7490
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/D3D9/Direct3DDevice9.cpp b/src/D3D9/Direct3DDevice9.cpp
index 515ab4b..126b0df 100644
--- a/src/D3D9/Direct3DDevice9.cpp
+++ b/src/D3D9/Direct3DDevice9.cpp
@@ -6271,8 +6271,8 @@
if(source->hasStencil())
{
- byte *sourceBuffer = (byte*)source->lockStencil(0, sw::PUBLIC);
- byte *destBuffer = (byte*)dest->lockStencil(0, sw::PUBLIC);
+ byte *sourceBuffer = (byte*)source->lockStencil(0, 0, 0, sw::PUBLIC);
+ byte *destBuffer = (byte*)dest->lockStencil(0, 0, 0, sw::PUBLIC);
unsigned int width = source->getWidth();
unsigned int height = source->getHeight();
diff --git a/src/OpenGL/common/Image.cpp b/src/OpenGL/common/Image.cpp
index b7362d8..c734ba2 100644
--- a/src/OpenGL/common/Image.cpp
+++ b/src/OpenGL/common/Image.cpp
@@ -1627,7 +1627,7 @@
{
LoadImageData<D24>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
- unsigned char *stencil = reinterpret_cast<unsigned char*>(lockStencil(0, sw::PUBLIC));
+ unsigned char *stencil = reinterpret_cast<unsigned char*>(lockStencil(0, 0, 0, sw::PUBLIC));
if(stencil)
{
@@ -1641,7 +1641,7 @@
{
LoadImageData<D32F>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, inputHeight, getPitch(), getHeight(), input, buffer);
- unsigned char *stencil = reinterpret_cast<unsigned char*>(lockStencil(0, sw::PUBLIC));
+ unsigned char *stencil = reinterpret_cast<unsigned char*>(lockStencil(0, 0, 0, sw::PUBLIC));
if(stencil)
{
diff --git a/src/OpenGL/libGL/Device.cpp b/src/OpenGL/libGL/Device.cpp
index 57c669f..86d01b9 100644
--- a/src/OpenGL/libGL/Device.cpp
+++ b/src/OpenGL/libGL/Device.cpp
@@ -570,8 +570,8 @@
if(source->hasStencil())
{
- sw::byte *sourceBuffer = (sw::byte*)source->lockStencil(0, PUBLIC);
- sw::byte *destBuffer = (sw::byte*)dest->lockStencil(0, PUBLIC);
+ sw::byte *sourceBuffer = (sw::byte*)source->lockStencil(0, 0, 0, PUBLIC);
+ sw::byte *destBuffer = (sw::byte*)dest->lockStencil(0, 0, 0, PUBLIC);
unsigned int width = source->getWidth();
unsigned int height = source->getHeight();
diff --git a/src/OpenGL/libGL/Image.cpp b/src/OpenGL/libGL/Image.cpp
index 49204f5..6a8c01d 100644
--- a/src/OpenGL/libGL/Image.cpp
+++ b/src/OpenGL/libGL/Image.cpp
@@ -672,7 +672,7 @@
}
}
- unsigned char *stencil = reinterpret_cast<unsigned char*>(lockStencil(0, sw::PUBLIC));
+ unsigned char *stencil = reinterpret_cast<unsigned char*>(lockStencil(0, 0, 0, sw::PUBLIC));
if(stencil)
{
diff --git a/src/OpenGL/libGLES_CM/Device.cpp b/src/OpenGL/libGLES_CM/Device.cpp
index 6587d36..b66c323 100644
--- a/src/OpenGL/libGLES_CM/Device.cpp
+++ b/src/OpenGL/libGLES_CM/Device.cpp
@@ -455,8 +455,8 @@
if(source->hasStencil())
{
- sw::byte *sourceBuffer = (sw::byte*)source->lockStencil(0, PUBLIC);
- sw::byte *destBuffer = (sw::byte*)dest->lockStencil(0, PUBLIC);
+ sw::byte *sourceBuffer = (sw::byte*)source->lockStencil(0, 0, 0, PUBLIC);
+ sw::byte *destBuffer = (sw::byte*)dest->lockStencil(0, 0, 0, PUBLIC);
unsigned int width = source->getWidth();
unsigned int height = source->getHeight();
diff --git a/src/OpenGL/libGLESv2/Device.cpp b/src/OpenGL/libGLESv2/Device.cpp
index 3307f45..225ceeb 100644
--- a/src/OpenGL/libGLESv2/Device.cpp
+++ b/src/OpenGL/libGLESv2/Device.cpp
@@ -621,8 +621,8 @@
if(source->hasStencil())
{
- sw::byte *sourceBuffer = (sw::byte*)source->lockStencil(0, PUBLIC);
- sw::byte *destBuffer = (sw::byte*)dest->lockStencil(0, PUBLIC);
+ sw::byte *sourceBuffer = (sw::byte*)source->lockStencil(0, 0, 0, PUBLIC);
+ sw::byte *destBuffer = (sw::byte*)dest->lockStencil(0, 0, 0, PUBLIC);
copyBuffer(sourceBuffer, destBuffer, source->getWidth(), source->getHeight(), source->getInternalPitchB(), dest->getInternalPitchB(), egl::Image::bytes(source->getInternalFormat()), flipX, flipY);
diff --git a/src/Renderer/Renderer.cpp b/src/Renderer/Renderer.cpp
index fe6c7f9..0700a88 100644
--- a/src/Renderer/Renderer.cpp
+++ b/src/Renderer/Renderer.cpp
@@ -634,7 +634,7 @@
if(draw->stencilBuffer)
{
- data->stencilBuffer = (unsigned char*)context->stencilBuffer->lockStencil(q * ms, MANAGED);
+ data->stencilBuffer = (unsigned char*)context->stencilBuffer->lockStencil(0, 0, q * ms, MANAGED);
data->stencilPitchB = context->stencilBuffer->getStencilPitchB();
data->stencilSliceB = context->stencilBuffer->getStencilSliceB();
}
diff --git a/src/Renderer/Surface.cpp b/src/Renderer/Surface.cpp
index 5ddea4a..d972574 100644
--- a/src/Renderer/Surface.cpp
+++ b/src/Renderer/Surface.cpp
@@ -1426,7 +1426,7 @@
internal.unlockRect();
}
- void *Surface::lockStencil(int front, Accessor client)
+ void *Surface::lockStencil(int x, int y, int front, Accessor client)
{
resource->lock(client);
@@ -1435,7 +1435,7 @@
stencil.buffer = allocateBuffer(stencil.width, stencil.height, stencil.depth, stencil.format);
}
- return stencil.lockRect(0, 0, front, LOCK_READWRITE); // FIXME
+ return stencil.lockRect(x, y, front, LOCK_READWRITE); // FIXME
}
void Surface::unlockStencil()
@@ -3258,7 +3258,7 @@
unsigned int fill = maskedS;
fill = fill | (fill << 8) | (fill << 16) + (fill << 24);
- char *buffer = (char*)lockStencil(0, PUBLIC);
+ char *buffer = (char*)lockStencil(0, 0, 0, PUBLIC);
// Stencil buffers are assumed to use quad layout
for(int z = 0; z < stencil.depth; z++)
diff --git a/src/Renderer/Surface.hpp b/src/Renderer/Surface.hpp
index cd89d74..dd96ffd 100644
--- a/src/Renderer/Surface.hpp
+++ b/src/Renderer/Surface.hpp
@@ -283,8 +283,9 @@
inline int getInternalSliceB() const;
inline int getInternalSliceP() const;
- void *lockStencil(int front, Accessor client);
+ void *lockStencil(int x, int y, int front, Accessor client);
void unlockStencil();
+ inline Format getStencilFormat() const;
inline int getStencilPitchB() const;
inline int getStencilSliceB() const;
@@ -573,6 +574,11 @@
return internal.sliceP;
}
+ Format Surface::getStencilFormat() const
+ {
+ return stencil.format;
+ }
+
int Surface::getStencilPitchB() const
{
return stencil.pitchB;