Commit c39901ec by Nicolas Capens

Refactor buffer clearing.

Bug 27460431 Change-Id: I90de3285c86c0d3187969270dcbd78a8b02feee9 Reviewed-on: https://swiftshader-review.googlesource.com/4978Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent dc4ae86d
......@@ -383,7 +383,6 @@ namespace D3D9
count = 1;
D3DRECT rect;
rect.x1 = viewport.X;
rect.x2 = viewport.X + viewport.Width;
rect.y1 = viewport.Y;
......@@ -394,36 +393,13 @@ namespace D3D9
for(unsigned int i = 0; i < count; i++)
{
D3DRECT rect = rects[i];
// Clamp against viewport
if(rect.x1 < (int)viewport.X) rect.x1 = viewport.X;
if(rect.x2 < (int)viewport.X) rect.x2 = viewport.X;
if(rect.x1 > (int)viewport.X + (int)viewport.Width) rect.x1 = viewport.X + viewport.Width;
if(rect.x2 > (int)viewport.X + (int)viewport.Width) rect.x2 = viewport.X + viewport.Width;
sw::SliceRect clearRect(rects[i].x1, rects[i].y1, rects[i].x2, rects[i].y2, 0);
if(rect.y1 < (int)viewport.Y) rect.y1 = viewport.Y;
if(rect.y2 < (int)viewport.Y) rect.y2 = viewport.Y;
if(rect.y1 > (int)viewport.Y + (int)viewport.Height) rect.y1 = viewport.Y + viewport.Height;
if(rect.y2 > (int)viewport.Y + (int)viewport.Height) rect.y2 = viewport.Y + viewport.Height;
clearRect.clip(viewport.X, viewport.Y, viewport.X + viewport.Width, viewport.Y + viewport.Height);
// Clamp against scissor rectangle
if(scissorEnable)
{
if(rect.x1 < (int)scissorRect.left) rect.x1 = scissorRect.left;
if(rect.x2 < (int)scissorRect.left) rect.x2 = scissorRect.left;
if(rect.x1 > (int)scissorRect.right) rect.x1 = scissorRect.right;
if(rect.x2 > (int)scissorRect.right) rect.x2 = scissorRect.right;
if(rect.y1 < (int)scissorRect.top) rect.y1 = scissorRect.top;
if(rect.y2 < (int)scissorRect.top) rect.y2 = scissorRect.top;
if(rect.y1 > (int)scissorRect.bottom) rect.y1 = scissorRect.bottom;
if(rect.y2 > (int)scissorRect.bottom) rect.y2 = scissorRect.bottom;
}
if(flags & D3DCLEAR_STENCIL)
{
depthStencil->clearStencilBuffer(stencil, 0xFF, rect.x1, rect.y1, rect.x2 - rect.x1, rect.y2 - rect.y1);
clearRect.clip(scissorRect.left, scissorRect.top, scissorRect.right, scissorRect.bottom);
}
if(flags & D3DCLEAR_TARGET)
......@@ -448,21 +424,20 @@ namespace D3D9
rgba[2] = sw::linearToSRGB(rgba[2]);
}
sw::SliceRect sliceRect;
if(renderTarget[index]->getClearRect(rect.x1, rect.y1, rect.x2 - rect.x1, rect.y2 - rect.y1, sliceRect))
{
renderer->clear(rgba, sw::FORMAT_A32B32G32R32F, renderTarget[index], sliceRect, 0xF);
}
renderer->clear(rgba, sw::FORMAT_A32B32G32R32F, renderTarget[index], clearRect, 0xF);
}
}
}
if(flags & D3DCLEAR_ZBUFFER)
{
if(z > 1) z = 1;
if(z < 0) z = 0;
z = sw::clamp01(z);
depthStencil->clearDepth(z, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());
}
depthStencil->clearDepthBuffer(z, rect.x1, rect.y1, rect.x2 - rect.x1, rect.y2 - rect.y1);
if(flags & D3DCLEAR_STENCIL)
{
depthStencil->clearStencil(stencil, 0xFF, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());
}
}
......
......@@ -162,13 +162,13 @@ namespace gl
}
Device::~Device()
{
{
if(depthStencil)
{
depthStencil->release();
depthStencil = 0;
}
if(renderTarget)
{
renderTarget->release();
......@@ -185,17 +185,11 @@ namespace gl
return;
}
int x0 = 0;
int y0 = 0;
int width = renderTarget->getWidth();
int height = renderTarget->getHeight();
sw::SliceRect clearRect = renderTarget->getRect();
if(scissorEnable) // Clamp against scissor rectangle
if(scissorEnable)
{
if(x0 < scissorRect.x0) x0 = scissorRect.x0;
if(y0 < scissorRect.y0) y0 = scissorRect.y0;
if(width > scissorRect.x1 - scissorRect.x0) width = scissorRect.x1 - scissorRect.x0;
if(height > scissorRect.y1 - scissorRect.y0) height = scissorRect.y1 - scissorRect.y0;
clearRect.clip(scissorRect.x0, scissorRect.y0, scissorRect.x1, scissorRect.y1);
}
float rgba[4];
......@@ -204,11 +198,7 @@ namespace gl
rgba[2] = blue;
rgba[3] = alpha;
sw::SliceRect sliceRect;
if(renderTarget->getClearRect(x0, y0, width, height, sliceRect))
{
clear(rgba, FORMAT_A32B32G32R32F, renderTarget, sliceRect, rgbaMask);
}
clear(rgba, FORMAT_A32B32G32R32F, renderTarget, clearRect, rgbaMask);
}
void Device::clearDepth(float z)
......@@ -218,23 +208,15 @@ namespace gl
return;
}
if(z > 1) z = 1;
if(z < 0) z = 0;
z = clamp01(z);
sw::SliceRect clearRect = depthStencil->getRect();
int x0 = 0;
int y0 = 0;
int width = depthStencil->getWidth();
int height = depthStencil->getHeight();
if(scissorEnable) // Clamp against scissor rectangle
if(scissorEnable)
{
if(x0 < scissorRect.x0) x0 = scissorRect.x0;
if(y0 < scissorRect.y0) y0 = scissorRect.y0;
if(width > scissorRect.x1 - scissorRect.x0) width = scissorRect.x1 - scissorRect.x0;
if(height > scissorRect.y1 - scissorRect.y0) height = scissorRect.y1 - scissorRect.y0;
clearRect.clip(scissorRect.x0, scissorRect.y0, scissorRect.x1, scissorRect.y1);
}
depthStencil->clearDepthBuffer(z, x0, y0, width, height);
depthStencil->clearDepth(z, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());
}
void Device::clearStencil(unsigned int stencil, unsigned int mask)
......@@ -244,20 +226,14 @@ namespace gl
return;
}
int x0 = 0;
int y0 = 0;
int width = depthStencil->getWidth();
int height = depthStencil->getHeight();
sw::SliceRect clearRect = depthStencil->getRect();
if(scissorEnable) // Clamp against scissor rectangle
if(scissorEnable)
{
if(x0 < scissorRect.x0) x0 = scissorRect.x0;
if(y0 < scissorRect.y0) y0 = scissorRect.y0;
if(width > scissorRect.x1 - scissorRect.x0) width = scissorRect.x1 - scissorRect.x0;
if(height > scissorRect.y1 - scissorRect.y0) height = scissorRect.y1 - scissorRect.y0;
clearRect.clip(scissorRect.x0, scissorRect.y0, scissorRect.x1, scissorRect.y1);
}
depthStencil->clearStencilBuffer(stencil, mask, x0, y0, width, height);
depthStencil->clearStencil(stencil, mask, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());
}
Image *Device::createDepthStencilSurface(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard)
......@@ -267,7 +243,7 @@ namespace gl
ERR("Invalid parameters: %dx%d", width, height);
return 0;
}
bool lockable = true;
switch(format)
......@@ -319,7 +295,7 @@ namespace gl
ERR("Out of memory");
return 0;
}
return surface;
}
......@@ -387,7 +363,7 @@ namespace gl
}
setIndexBuffer(0);
DrawType drawType;
switch(primitiveType)
......@@ -491,7 +467,7 @@ namespace gl
vertexShaderConstantF[startRegister + i][2] = constantData[i * 4 + 2];
vertexShaderConstantF[startRegister + i][3] = constantData[i * 4 + 3];
}
vertexShaderConstantsFDirty = max(startRegister + count, vertexShaderConstantsFDirty);
vertexShaderDirty = true; // Reload DEF constants
}
......@@ -508,7 +484,7 @@ namespace gl
ERR("Invalid parameters");
return false;
}
int sWidth = source->getWidth();
int sHeight = source->getHeight();
int dWidth = dest->getWidth();
......@@ -619,7 +595,7 @@ namespace gl
destBytes[4 * x + 3] = 0xFF;
}
}
sourceBytes += sourcePitch;
destBytes += destPitch;
}
......@@ -677,7 +653,7 @@ namespace gl
{
Renderer::setVertexShaderConstantF(0, vertexShaderConstantF[0], vertexShaderConstantsFDirty);
}
Renderer::setVertexShader(vertexShader); // Loads shader constants set with DEF
vertexShaderConstantsFDirty = vertexShader->dirtyConstantsF; // Shader DEF'ed constants are dirty
}
......@@ -689,7 +665,7 @@ namespace gl
vertexShaderDirty = false;
}
}
bool Device::bindViewport()
{
if(viewport.width <= 0 || viewport.height <= 0)
......@@ -709,7 +685,7 @@ namespace gl
scissor.x1 = scissorRect.x1;
scissor.y0 = scissorRect.y0;
scissor.y1 = scissorRect.y1;
setScissor(scissor);
}
else
......@@ -719,7 +695,7 @@ namespace gl
scissor.x1 = viewport.x0 + viewport.width;
scissor.y0 = viewport.y0;
scissor.y1 = viewport.y0 + viewport.height;
if(renderTarget)
{
scissor.x0 = max(scissor.x0, 0);
......@@ -746,7 +722,7 @@ namespace gl
view.height = (float)viewport.height;
view.minZ = viewport.minZ;
view.maxZ = viewport.maxZ;
Renderer::setViewport(view);
return true;
......
......@@ -150,30 +150,20 @@ namespace es1
return;
}
int x0 = 0;
int y0 = 0;
int width = renderTarget->getWidth();
int height = renderTarget->getHeight();
if(scissorEnable) // Clamp against scissor rectangle
{
if(x0 < scissorRect.x0) x0 = scissorRect.x0;
if(y0 < scissorRect.y0) y0 = scissorRect.y0;
if(width > scissorRect.x1 - scissorRect.x0) width = scissorRect.x1 - scissorRect.x0;
if(height > scissorRect.y1 - scissorRect.y0) height = scissorRect.y1 - scissorRect.y0;
}
float rgba[4];
rgba[0] = red;
rgba[1] = green;
rgba[2] = blue;
rgba[3] = alpha;
sw::SliceRect sliceRect;
if(renderTarget->getClearRect(x0, y0, width, height, sliceRect))
sw::SliceRect clearRect = renderTarget->getRect();
if(scissorEnable)
{
clear(rgba, FORMAT_A32B32G32R32F, renderTarget, sliceRect, rgbaMask);
clearRect.clip(scissorRect.x0, scissorRect.y0, scissorRect.x1, scissorRect.y1);
}
clear(rgba, FORMAT_A32B32G32R32F, renderTarget, clearRect, rgbaMask);
}
void Device::clearDepth(float z)
......@@ -183,23 +173,15 @@ namespace es1
return;
}
if(z > 1) z = 1;
if(z < 0) z = 0;
int x0 = 0;
int y0 = 0;
int width = depthBuffer->getWidth();
int height = depthBuffer->getHeight();
z = clamp01(z);
sw::SliceRect clearRect = depthBuffer->getRect();
if(scissorEnable) // Clamp against scissor rectangle
if(scissorEnable)
{
if(x0 < scissorRect.x0) x0 = scissorRect.x0;
if(y0 < scissorRect.y0) y0 = scissorRect.y0;
if(width > scissorRect.x1 - scissorRect.x0) width = scissorRect.x1 - scissorRect.x0;
if(height > scissorRect.y1 - scissorRect.y0) height = scissorRect.y1 - scissorRect.y0;
clearRect.clip(scissorRect.x0, scissorRect.y0, scissorRect.x1, scissorRect.y1);
}
depthBuffer->clearDepthBuffer(z, x0, y0, width, height);
depthBuffer->clearDepth(z, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());
}
void Device::clearStencil(unsigned int stencil, unsigned int mask)
......@@ -209,20 +191,14 @@ namespace es1
return;
}
int x0 = 0;
int y0 = 0;
int width = stencilBuffer->getWidth();
int height = stencilBuffer->getHeight();
sw::SliceRect clearRect = stencilBuffer->getRect();
if(scissorEnable) // Clamp against scissor rectangle
if(scissorEnable)
{
if(x0 < scissorRect.x0) x0 = scissorRect.x0;
if(y0 < scissorRect.y0) y0 = scissorRect.y0;
if(width > scissorRect.x1 - scissorRect.x0) width = scissorRect.x1 - scissorRect.x0;
if(height > scissorRect.y1 - scissorRect.y0) height = scissorRect.y1 - scissorRect.y0;
clearRect.clip(scissorRect.x0, scissorRect.y0, scissorRect.x1, scissorRect.y1);
}
stencilBuffer->clearStencilBuffer(stencil, mask, x0, y0, width, height);
stencilBuffer->clearStencil(stencil, mask, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());
}
egl::Image *Device::createDepthStencilSurface(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard)
......
......@@ -2754,18 +2754,6 @@ void Context::applyScissor(int width, int height)
}
}
egl::Image *Context::getScissoredImage(GLint drawbuffer, int &x0, int &y0, int &width, int &height, bool depthStencil)
{
Framebuffer* framebuffer = getDrawFramebuffer();
egl::Image* image = depthStencil ? framebuffer->getDepthStencil() : framebuffer->getRenderTarget(drawbuffer);
applyScissor(image->getWidth(), image->getHeight());
device->getScissoredRegion(image, x0, y0, width, height);
return image;
}
// Applies the render target surface, depth stencil surface, viewport rectangle and scissor rectangle
bool Context::applyRenderTarget()
{
......@@ -3407,18 +3395,24 @@ void Context::clear(GLbitfield mask)
void Context::clearColorBuffer(GLint drawbuffer, void *value, sw::Format format)
{
unsigned int rgbaMask = getColorMask();
if(device && rgbaMask && !mState.rasterizerDiscardEnabled)
if(rgbaMask && !mState.rasterizerDiscardEnabled)
{
int x0(0), y0(0), width(0), height(0);
egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, false);
Framebuffer *framebuffer = getDrawFramebuffer();
egl::Image *colorbuffer = framebuffer->getRenderTarget(drawbuffer);
sw::SliceRect sliceRect;
if(image->getClearRect(x0, y0, width, height, sliceRect))
if(colorbuffer)
{
device->clear(value, format, image, sliceRect, rgbaMask);
}
sw::SliceRect clearRect = colorbuffer->getRect();
image->release();
if(mState.scissorTestEnabled)
{
clearRect.clip(mState.scissorX, mState.scissorY, mState.scissorX + mState.scissorWidth, mState.scissorY + mState.scissorHeight);
}
device->clear(value, format, colorbuffer, clearRect, rgbaMask);
colorbuffer->release();
}
}
}
......@@ -3437,52 +3431,51 @@ void Context::clearColorBuffer(GLint drawbuffer, const GLfloat *value)
clearColorBuffer(drawbuffer, (void*)value, sw::FORMAT_A32B32G32R32F);
}
void Context::clearDepthBuffer(GLint drawbuffer, const GLfloat *value)
void Context::clearDepthBuffer(const GLfloat value)
{
if(device && mState.depthMask && !mState.rasterizerDiscardEnabled)
if(mState.depthMask && !mState.rasterizerDiscardEnabled)
{
int x0(0), y0(0), width(0), height(0);
egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, true);
float depth = clamp01(value[0]);
image->clearDepthBuffer(depth, x0, y0, width, height);
Framebuffer *framebuffer = getDrawFramebuffer();
egl::Image *depthbuffer = framebuffer->getDepthStencil();
image->release();
}
}
if(depthbuffer)
{
float depth = clamp01(value);
sw::SliceRect clearRect = depthbuffer->getRect();
void Context::clearStencilBuffer(GLint drawbuffer, const GLint *value)
{
if(device && mState.stencilWritemask && !mState.rasterizerDiscardEnabled)
{
int x0(0), y0(0), width(0), height(0);
egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, true);
if(mState.scissorTestEnabled)
{
clearRect.clip(mState.scissorX, mState.scissorY, mState.scissorX + mState.scissorWidth, mState.scissorY + mState.scissorHeight);
}
unsigned char stencil = value[0] < 0 ? 0 : static_cast<unsigned char>(value[0] & 0x000000FF);
image->clearStencilBuffer(stencil, static_cast<unsigned char>(mState.stencilWritemask), x0, y0, width, height);
depthbuffer->clearDepth(depth, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());
image->release();
depthbuffer->release();
}
}
}
void Context::clearDepthStencilBuffer(GLint drawbuffer, GLfloat depth, GLint stencil)
void Context::clearStencilBuffer(const GLint value)
{
if(device && (mState.depthMask || mState.stencilWritemask) && !mState.rasterizerDiscardEnabled)
if(mState.stencilWritemask && !mState.rasterizerDiscardEnabled)
{
int x0(0), y0(0), width(0), height(0);
egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, true);
Framebuffer *framebuffer = getDrawFramebuffer();
egl::Image *stencilbuffer = framebuffer->getDepthStencil();
if(mState.stencilWritemask)
if(stencilbuffer)
{
image->clearStencilBuffer(static_cast<unsigned char>(stencil & 0x000000FF), static_cast<unsigned char>(mState.stencilWritemask), x0, y0, width, height);
}
unsigned char stencil = value < 0 ? 0 : static_cast<unsigned char>(value & 0x000000FF);
sw::SliceRect clearRect = stencilbuffer->getRect();
if(mState.depthMask)
{
image->clearDepthBuffer(clamp01(depth), x0, y0, width, height);
}
if(mState.scissorTestEnabled)
{
clearRect.clip(mState.scissorX, mState.scissorY, mState.scissorX + mState.scissorWidth, mState.scissorY + mState.scissorHeight);
}
stencilbuffer->clearStencil(stencil, static_cast<unsigned char>(mState.stencilWritemask), clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());
image->release();
stencilbuffer->release();
}
}
}
......
......@@ -644,9 +644,8 @@ public:
void clearColorBuffer(GLint drawbuffer, const GLint *value);
void clearColorBuffer(GLint drawbuffer, const GLuint *value);
void clearColorBuffer(GLint drawbuffer, const GLfloat *value);
void clearDepthBuffer(GLint drawbuffer, const GLfloat *value);
void clearStencilBuffer(GLint drawbuffer, const GLint *value);
void clearDepthStencilBuffer(GLint drawbuffer, GLfloat depth, GLint stencil);
void clearDepthBuffer(const GLfloat value);
void clearStencilBuffer(const GLint value);
void drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount = 1);
void drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLsizei instanceCount = 1);
void finish();
......@@ -677,7 +676,6 @@ public:
private:
virtual ~Context();
egl::Image *getScissoredImage(GLint drawbuffer, int &x0, int &y0, int &width, int &height, bool depthStencil);
void applyScissor(int width, int height);
bool applyRenderTarget();
void applyState(GLenum drawMode);
......
......@@ -173,22 +173,6 @@ namespace es2
delete context;
}
void Device::getScissoredRegion(egl::Image *sourceSurface, int &x0, int &y0, int& width, int& height) const
{
x0 = 0;
y0 = 0;
width = sourceSurface->getWidth();
height = sourceSurface->getHeight();
if(scissorEnable) // Clamp against scissor rectangle
{
if(x0 < scissorRect.x0) x0 = scissorRect.x0;
if(y0 < scissorRect.y0) y0 = scissorRect.y0;
if(width > scissorRect.x1 - scissorRect.x0) width = scissorRect.x1 - scissorRect.x0;
if(height > scissorRect.y1 - scissorRect.y0) height = scissorRect.y1 - scissorRect.y0;
}
}
void Device::clearColor(float red, float green, float blue, float alpha, unsigned int rgbaMask)
{
if(!rgbaMask)
......@@ -206,17 +190,17 @@ namespace es2
{
if(renderTarget[i])
{
int x0(0), y0(0), width(0), height(0);
getScissoredRegion(renderTarget[i], x0, y0, width, height);
sw::SliceRect clearRect = renderTarget[i]->getRect();
sw::SliceRect sliceRect;
if(renderTarget[i]->getClearRect(x0, y0, width, height, sliceRect))
if(scissorEnable)
{
int depth = sw::max(renderTarget[i]->getDepth(), 1);
for(sliceRect.slice = 0; sliceRect.slice < depth; ++sliceRect.slice)
{
clear(rgba, FORMAT_A32B32G32R32F, renderTarget[i], sliceRect, rgbaMask);
}
clearRect.clip(scissorRect.x0, scissorRect.y0, scissorRect.x1, scissorRect.y1);
}
int depth = sw::max(renderTarget[i]->getDepth(), 1);
for(clearRect.slice = 0; clearRect.slice < depth; clearRect.slice++)
{
clear(rgba, FORMAT_A32B32G32R32F, renderTarget[i], clearRect, rgbaMask);
}
}
}
......@@ -229,13 +213,15 @@ namespace es2
return;
}
if(z > 1) z = 1;
if(z < 0) z = 0;
z = clamp01(z);
sw::SliceRect clearRect = depthBuffer->getRect();
int x0(0), y0(0), width(0), height(0);
getScissoredRegion(depthBuffer, x0, y0, width, height);
if(scissorEnable)
{
clearRect.clip(scissorRect.x0, scissorRect.y0, scissorRect.x1, scissorRect.y1);
}
depthBuffer->clearDepthBuffer(z, x0, y0, width, height);
depthBuffer->clearDepth(z, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());
}
void Device::clearStencil(unsigned int stencil, unsigned int mask)
......@@ -245,10 +231,14 @@ namespace es2
return;
}
int x0(0), y0(0), width(0), height(0);
getScissoredRegion(stencilBuffer, x0, y0, width, height);
sw::SliceRect clearRect = stencilBuffer->getRect();
if(scissorEnable)
{
clearRect.clip(scissorRect.x0, scissorRect.y0, scissorRect.x1, scissorRect.y1);
}
stencilBuffer->clearStencilBuffer(stencil, mask, x0, y0, width, height);
stencilBuffer->clearStencil(stencil, mask, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());
}
egl::Image *Device::createDepthStencilSurface(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard)
......
......@@ -62,8 +62,6 @@ namespace es2
virtual bool stretchCube(sw::Surface *sourceSurface, sw::Surface *destSurface);
virtual void finish();
void getScissoredRegion(egl::Image *sourceSurface, int &x0, int &y0, int& width, int& height) const;
private:
sw::Context *const context;
......
......@@ -2586,7 +2586,7 @@ GL_APICALL void GL_APIENTRY glClearBufferiv(GLenum buffer, GLint drawbuffer, con
}
else
{
context->clearStencilBuffer(drawbuffer, value);
context->clearStencilBuffer(value[0]);
}
break;
default:
......@@ -2650,7 +2650,7 @@ GL_APICALL void GL_APIENTRY glClearBufferfv(GLenum buffer, GLint drawbuffer, con
}
else
{
context->clearDepthBuffer(drawbuffer, value);
context->clearDepthBuffer(value[0]);
}
break;
default:
......@@ -2677,7 +2677,8 @@ GL_APICALL void GL_APIENTRY glClearBufferfi(GLenum buffer, GLint drawbuffer, GLf
}
else
{
context->clearDepthStencilBuffer(drawbuffer, depth, stencil);
context->clearDepthBuffer(depth);
context->clearStencilBuffer(stencil);
}
break;
default:
......
......@@ -27,6 +27,9 @@ namespace sw
void clip(int minX, int minY, int maxX, int maxY);
int width() const { return x1 - x0; }
int height() const { return y1 - y0; }
int x0; // Inclusive
int y0; // Inclusive
int x1; // Exclusive
......@@ -154,7 +157,7 @@ namespace sw
FORMAT_R32F,
FORMAT_G32R32F,
FORMAT_B32G32R32F,
FORMAT_A32B32G32R32F,
FORMAT_A32B32G32R32F,
// Bump map formats
FORMAT_V8U8,
FORMAT_L6V5U5,
......@@ -283,9 +286,9 @@ namespace sw
inline int getSuperSampleCount() const;
bool isEntire(const SliceRect& rect) const;
bool getClearRect(int x0, int y0, int width, int height, SliceRect& rect) const;
void clearDepthBuffer(float depth, int x0, int y0, int width, int height);
void clearStencilBuffer(unsigned char stencil, unsigned char mask, int x0, int y0, int width, int height);
SliceRect getRect() const;
void clearDepth(float depth, int x0, int y0, int width, int height);
void clearStencil(unsigned char stencil, unsigned char mask, int x0, int y0, int width, int height);
void fill(const Color<float> &color, int x0, int y0, int width, int height);
Color<float> readExternal(int x, int y, int z) const;
......@@ -294,7 +297,7 @@ namespace sw
Color<float> sampleExternal(float x, float y) const;
void writeExternal(int x, int y, int z, const Color<float> &color);
void writeExternal(int x, int y, const Color<float> &color);
void copyInternal(const Surface* src, int x, int y, float srcX, float srcY, bool filter);
void copyInternal(const Surface* src, int x, int y, int z, float srcX, float srcY, float srcZ, bool filter);
......
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