Implement framebuffer layer support.
This stores the layer as part of the framebuffer object, instead of the
renderbuffer, and passes it to the renderer at draw time.
Change-Id: I947f8a58ba7a119cc9d890659c99e7e05d0d1d91
Reviewed-on: https://swiftshader-review.googlesource.com/14728
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/Renderer/Surface.cpp b/src/Renderer/Surface.cpp
index b758bad..b809148 100644
--- a/src/Renderer/Surface.cpp
+++ b/src/Renderer/Surface.cpp
@@ -3338,22 +3338,22 @@
const bool entire = x0 == 0 && y0 == 0 && width == internal.width && height == internal.height;
const Lock lock = entire ? LOCK_DISCARD : LOCK_WRITEONLY;
- int width2 = (internal.width + 1) & ~1;
-
int x1 = x0 + width;
int y1 = y0 + height;
if(!hasQuadLayout(internal.format))
{
- float *target = (float*)lockInternal(0, 0, 0, lock, PUBLIC) + x0 + width2 * y0;
+ float *target = (float*)lockInternal(x0, y0, 0, lock, PUBLIC);
for(int z = 0; z < internal.samples; z++)
{
+ float *row = target;
for(int y = y0; y < y1; y++)
{
- memfill4(target, (int&)depth, 4 * width);
- target += width2;
+ memfill4(row, (int&)depth, width * sizeof(float));
+ row += internal.pitchP;
}
+ target += internal.sliceP;
}
unlockInternal();
@@ -3376,7 +3376,7 @@
{
for(int y = y0; y < y1; y++)
{
- float *target = buffer + (y & ~1) * width2 + (y & 1) * 2;
+ float *target = buffer + (y & ~1) * internal.pitchP + (y & 1) * 2;
if((y & 1) == 0 && y + 1 < y1) // Fill quad line at once
{
@@ -3458,8 +3458,6 @@
if(y0 < 0) {height += y0; y0 = 0;}
if(y0 + height > internal.height) height = internal.height - y0;
- int width2 = (internal.width + 1) & ~1;
-
int x1 = x0 + width;
int y1 = y0 + height;
@@ -3480,7 +3478,7 @@
{
for(int y = y0; y < y1; y++)
{
- char *target = buffer + (y & ~1) * width2 + (y & 1) * 2;
+ char *target = buffer + (y & ~1) * stencil.pitchP + (y & 1) * 2;
if((y & 1) == 0 && y + 1 < y1 && mask == 0xFF) // Fill quad line at once
{
@@ -3502,8 +3500,9 @@
}
else
{
- for(int x = x0, i = oddX0; x < x1; x++, i = (x & ~1) * 2 + (x & 1))
+ for(int x = x0; x < x1; x++)
{
+ int i = (x & ~1) * 2 + (x & 1);
target[i] = maskedS | (target[i] & invMask);
}
}