OSDN Git Service

Refactor buffer clearing.
authorNicolas Capens <capn@google.com>
Mon, 21 Mar 2016 20:37:44 +0000 (16:37 -0400)
committerNicolas Capens <capn@google.com>
Thu, 24 Mar 2016 16:35:46 +0000 (16:35 +0000)
Bug 27460431

Change-Id: I90de3285c86c0d3187969270dcbd78a8b02feee9
Reviewed-on: https://swiftshader-review.googlesource.com/4978
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
src/D3D9/Direct3DDevice9.cpp
src/OpenGL/libGL/Device.cpp
src/OpenGL/libGLES_CM/Device.cpp
src/OpenGL/libGLESv2/Context.cpp
src/OpenGL/libGLESv2/Context.h
src/OpenGL/libGLESv2/Device.cpp
src/OpenGL/libGLESv2/Device.hpp
src/OpenGL/libGLESv2/libGLESv3.cpp
src/Renderer/Surface.cpp
src/Renderer/Surface.hpp

index 02165e7..9000357 100644 (file)
@@ -383,7 +383,6 @@ namespace D3D9
                        count = 1;\r
 \r
                        D3DRECT rect;\r
-\r
                        rect.x1 = viewport.X;\r
                        rect.x2 = viewport.X + viewport.Width;\r
                        rect.y1 = viewport.Y;\r
@@ -394,36 +393,13 @@ namespace D3D9
 \r
                for(unsigned int i = 0; i < count; i++)\r
                {\r
-                       D3DRECT rect = rects[i];\r
-\r
-                       // Clamp against viewport\r
-                       if(rect.x1 < (int)viewport.X) rect.x1 = viewport.X;\r
-                       if(rect.x2 < (int)viewport.X) rect.x2 = viewport.X;\r
-                       if(rect.x1 > (int)viewport.X + (int)viewport.Width) rect.x1 = viewport.X + viewport.Width;\r
-                       if(rect.x2 > (int)viewport.X + (int)viewport.Width) rect.x2 = viewport.X + viewport.Width;\r
+                       sw::SliceRect clearRect(rects[i].x1, rects[i].y1, rects[i].x2, rects[i].y2, 0);\r
 \r
-                       if(rect.y1 < (int)viewport.Y) rect.y1 = viewport.Y;\r
-                       if(rect.y2 < (int)viewport.Y) rect.y2 = viewport.Y;\r
-                       if(rect.y1 > (int)viewport.Y + (int)viewport.Height) rect.y1 = viewport.Y + viewport.Height;\r
-                       if(rect.y2 > (int)viewport.Y + (int)viewport.Height) rect.y2 = viewport.Y + viewport.Height;\r
+                       clearRect.clip(viewport.X, viewport.Y, viewport.X + viewport.Width, viewport.Y + viewport.Height);\r
 \r
-                       // Clamp against scissor rectangle\r
                        if(scissorEnable)\r
                        {\r
-                               if(rect.x1 < (int)scissorRect.left) rect.x1 = scissorRect.left;\r
-                               if(rect.x2 < (int)scissorRect.left) rect.x2 = scissorRect.left;\r
-                               if(rect.x1 > (int)scissorRect.right) rect.x1 = scissorRect.right;\r
-                               if(rect.x2 > (int)scissorRect.right) rect.x2 = scissorRect.right;\r
-\r
-                               if(rect.y1 < (int)scissorRect.top) rect.y1 = scissorRect.top;\r
-                               if(rect.y2 < (int)scissorRect.top) rect.y2 = scissorRect.top;\r
-                               if(rect.y1 > (int)scissorRect.bottom) rect.y1 = scissorRect.bottom;\r
-                               if(rect.y2 > (int)scissorRect.bottom) rect.y2 = scissorRect.bottom;\r
-                       }\r
-\r
-                       if(flags & D3DCLEAR_STENCIL)\r
-                       {\r
-                               depthStencil->clearStencilBuffer(stencil, 0xFF, rect.x1, rect.y1, rect.x2 - rect.x1, rect.y2 - rect.y1);\r
+                               clearRect.clip(scissorRect.left, scissorRect.top, scissorRect.right, scissorRect.bottom);\r
                        }\r
 \r
                        if(flags & D3DCLEAR_TARGET)\r
@@ -448,21 +424,20 @@ namespace D3D9
                                                        rgba[2] = sw::linearToSRGB(rgba[2]);\r
                                                }\r
 \r
-                                               sw::SliceRect sliceRect;\r
-                                               if(renderTarget[index]->getClearRect(rect.x1, rect.y1, rect.x2 - rect.x1, rect.y2 - rect.y1, sliceRect))\r
-                                               {\r
-                                                       renderer->clear(rgba, sw::FORMAT_A32B32G32R32F, renderTarget[index], sliceRect, 0xF);\r
-                                               }\r
+                                               renderer->clear(rgba, sw::FORMAT_A32B32G32R32F, renderTarget[index], clearRect, 0xF);\r
                                        }\r
                                }\r
                        }\r
 \r
                        if(flags & D3DCLEAR_ZBUFFER)\r
                        {\r
-                               if(z > 1) z = 1;\r
-                               if(z < 0) z = 0;\r
+                               z = sw::clamp01(z);\r
+                               depthStencil->clearDepth(z, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());\r
+                       }\r
 \r
-                               depthStencil->clearDepthBuffer(z, rect.x1, rect.y1, rect.x2 - rect.x1, rect.y2 - rect.y1);\r
+                       if(flags & D3DCLEAR_STENCIL)\r
+                       {\r
+                               depthStencil->clearStencil(stencil, 0xFF, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());\r
                        }\r
                }\r
 \r
index 9b2df3c..cdc9db7 100644 (file)
@@ -162,13 +162,13 @@ namespace gl
        }\r
 \r
        Device::~Device()\r
-       {               \r
+       {\r
                if(depthStencil)\r
                {\r
                        depthStencil->release();\r
                        depthStencil = 0;\r
                }\r
-               \r
+\r
                if(renderTarget)\r
                {\r
                        renderTarget->release();\r
@@ -185,17 +185,11 @@ namespace gl
                        return;\r
                }\r
 \r
-               int x0 = 0;\r
-               int y0 = 0;\r
-               int width = renderTarget->getWidth();\r
-               int height = renderTarget->getHeight();\r
+               sw::SliceRect clearRect = renderTarget->getRect();\r
 \r
-               if(scissorEnable)   // Clamp against scissor rectangle\r
+               if(scissorEnable)\r
                {\r
-                       if(x0 < scissorRect.x0) x0 = scissorRect.x0;\r
-                       if(y0 < scissorRect.y0) y0 = scissorRect.y0;\r
-                       if(width > scissorRect.x1 - scissorRect.x0) width = scissorRect.x1 - scissorRect.x0;\r
-                       if(height > scissorRect.y1 - scissorRect.y0) height = scissorRect.y1 - scissorRect.y0;\r
+                       clearRect.clip(scissorRect.x0, scissorRect.y0, scissorRect.x1, scissorRect.y1);\r
                }\r
 \r
                float rgba[4];\r
@@ -204,11 +198,7 @@ namespace gl
                rgba[2] = blue;\r
                rgba[3] = alpha;\r
 \r
-               sw::SliceRect sliceRect;\r
-               if(renderTarget->getClearRect(x0, y0, width, height, sliceRect))\r
-               {\r
-                       clear(rgba, FORMAT_A32B32G32R32F, renderTarget, sliceRect, rgbaMask);\r
-               }\r
+               clear(rgba, FORMAT_A32B32G32R32F, renderTarget, clearRect, rgbaMask);\r
        }\r
 \r
        void Device::clearDepth(float z)\r
@@ -218,23 +208,15 @@ namespace gl
                        return;\r
                }\r
 \r
-               if(z > 1) z = 1;\r
-               if(z < 0) z = 0;\r
+               z = clamp01(z);\r
+               sw::SliceRect clearRect = depthStencil->getRect();\r
 \r
-               int x0 = 0;\r
-               int y0 = 0;\r
-               int width = depthStencil->getWidth();\r
-               int height = depthStencil->getHeight();\r
-\r
-               if(scissorEnable)   // Clamp against scissor rectangle\r
+               if(scissorEnable)\r
                {\r
-                       if(x0 < scissorRect.x0) x0 = scissorRect.x0;\r
-                       if(y0 < scissorRect.y0) y0 = scissorRect.y0;\r
-                       if(width > scissorRect.x1 - scissorRect.x0) width = scissorRect.x1 - scissorRect.x0;\r
-                       if(height > scissorRect.y1 - scissorRect.y0) height = scissorRect.y1 - scissorRect.y0;\r
+                       clearRect.clip(scissorRect.x0, scissorRect.y0, scissorRect.x1, scissorRect.y1);\r
                }\r
-                       \r
-               depthStencil->clearDepthBuffer(z, x0, y0, width, height);\r
+\r
+               depthStencil->clearDepth(z, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());\r
        }\r
 \r
        void Device::clearStencil(unsigned int stencil, unsigned int mask)\r
@@ -244,20 +226,14 @@ namespace gl
                        return;\r
                }\r
 \r
-               int x0 = 0;\r
-               int y0 = 0;\r
-               int width = depthStencil->getWidth();\r
-               int height = depthStencil->getHeight();\r
+               sw::SliceRect clearRect = depthStencil->getRect();\r
 \r
-               if(scissorEnable)   // Clamp against scissor rectangle\r
+               if(scissorEnable)\r
                {\r
-                       if(x0 < scissorRect.x0) x0 = scissorRect.x0;\r
-                       if(y0 < scissorRect.y0) y0 = scissorRect.y0;\r
-                       if(width > scissorRect.x1 - scissorRect.x0) width = scissorRect.x1 - scissorRect.x0;\r
-                       if(height > scissorRect.y1 - scissorRect.y0) height = scissorRect.y1 - scissorRect.y0;\r
+                       clearRect.clip(scissorRect.x0, scissorRect.y0, scissorRect.x1, scissorRect.y1);\r
                }\r
 \r
-               depthStencil->clearStencilBuffer(stencil, mask, x0, y0, width, height);\r
+               depthStencil->clearStencil(stencil, mask, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());\r
        }\r
 \r
        Image *Device::createDepthStencilSurface(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard)\r
@@ -267,7 +243,7 @@ namespace gl
                        ERR("Invalid parameters: %dx%d", width, height);\r
                        return 0;\r
                }\r
-               \r
+\r
                bool lockable = true;\r
 \r
                switch(format)\r
@@ -319,7 +295,7 @@ namespace gl
                        ERR("Out of memory");\r
                        return 0;\r
                }\r
-               \r
+\r
                return surface;\r
        }\r
 \r
@@ -387,7 +363,7 @@ namespace gl
                }\r
 \r
                setIndexBuffer(0);\r
-               \r
+\r
                DrawType drawType;\r
 \r
                switch(primitiveType)\r
@@ -491,7 +467,7 @@ namespace gl
                        vertexShaderConstantF[startRegister + i][2] = constantData[i * 4 + 2];\r
                        vertexShaderConstantF[startRegister + i][3] = constantData[i * 4 + 3];\r
                }\r
-                       \r
+\r
                vertexShaderConstantsFDirty = max(startRegister + count, vertexShaderConstantsFDirty);\r
                vertexShaderDirty = true;   // Reload DEF constants\r
        }\r
@@ -508,7 +484,7 @@ namespace gl
                        ERR("Invalid parameters");\r
                        return false;\r
                }\r
-               \r
+\r
                int sWidth = source->getWidth();\r
                int sHeight = source->getHeight();\r
                int dWidth = dest->getWidth();\r
@@ -619,7 +595,7 @@ namespace gl
                                                destBytes[4 * x + 3] = 0xFF;\r
                                        }\r
                                }\r
-                               \r
+\r
                                sourceBytes += sourcePitch;\r
                                destBytes += destPitch;\r
                        }\r
@@ -677,7 +653,7 @@ namespace gl
                                {\r
                                        Renderer::setVertexShaderConstantF(0, vertexShaderConstantF[0], vertexShaderConstantsFDirty);\r
                                }\r
-               \r
+\r
                                Renderer::setVertexShader(vertexShader);   // Loads shader constants set with DEF\r
                                vertexShaderConstantsFDirty = vertexShader->dirtyConstantsF;   // Shader DEF'ed constants are dirty\r
                        }\r
@@ -689,7 +665,7 @@ namespace gl
                        vertexShaderDirty = false;\r
                }\r
        }\r
-       \r
+\r
        bool Device::bindViewport()\r
        {\r
                if(viewport.width <= 0 || viewport.height <= 0)\r
@@ -709,7 +685,7 @@ namespace gl
                        scissor.x1 = scissorRect.x1;\r
                        scissor.y0 = scissorRect.y0;\r
                        scissor.y1 = scissorRect.y1;\r
-                       \r
+\r
                        setScissor(scissor);\r
                }\r
                else\r
@@ -719,7 +695,7 @@ namespace gl
                        scissor.x1 = viewport.x0 + viewport.width;\r
                        scissor.y0 = viewport.y0;\r
                        scissor.y1 = viewport.y0 + viewport.height;\r
-                       \r
+\r
                        if(renderTarget)\r
                        {\r
                                scissor.x0 = max(scissor.x0, 0);\r
@@ -746,7 +722,7 @@ namespace gl
                view.height = (float)viewport.height;\r
                view.minZ = viewport.minZ;\r
                view.maxZ = viewport.maxZ;\r
-               \r
+\r
                Renderer::setViewport(view);\r
 \r
                return true;\r
index 80cb86e..65f29fc 100644 (file)
@@ -150,30 +150,20 @@ namespace es1
                        return;\r
                }\r
 \r
-               int x0 = 0;\r
-               int y0 = 0;\r
-               int width = renderTarget->getWidth();\r
-               int height = renderTarget->getHeight();\r
-\r
-               if(scissorEnable)   // Clamp against scissor rectangle\r
-               {\r
-                       if(x0 < scissorRect.x0) x0 = scissorRect.x0;\r
-                       if(y0 < scissorRect.y0) y0 = scissorRect.y0;\r
-                       if(width > scissorRect.x1 - scissorRect.x0) width = scissorRect.x1 - scissorRect.x0;\r
-                       if(height > scissorRect.y1 - scissorRect.y0) height = scissorRect.y1 - scissorRect.y0;\r
-               }\r
-\r
                float rgba[4];\r
                rgba[0] = red;\r
                rgba[1] = green;\r
                rgba[2] = blue;\r
                rgba[3] = alpha;\r
 \r
-               sw::SliceRect sliceRect;\r
-               if(renderTarget->getClearRect(x0, y0, width, height, sliceRect))\r
+               sw::SliceRect clearRect = renderTarget->getRect();\r
+\r
+               if(scissorEnable)\r
                {\r
-                       clear(rgba, FORMAT_A32B32G32R32F, renderTarget, sliceRect, rgbaMask);\r
+                       clearRect.clip(scissorRect.x0, scissorRect.y0, scissorRect.x1, scissorRect.y1);\r
                }\r
+\r
+               clear(rgba, FORMAT_A32B32G32R32F, renderTarget, clearRect, rgbaMask);\r
        }\r
 \r
        void Device::clearDepth(float z)\r
@@ -183,23 +173,15 @@ namespace es1
                        return;\r
                }\r
 \r
-               if(z > 1) z = 1;\r
-               if(z < 0) z = 0;\r
-\r
-               int x0 = 0;\r
-               int y0 = 0;\r
-               int width = depthBuffer->getWidth();\r
-               int height = depthBuffer->getHeight();\r
+               z = clamp01(z);\r
+               sw::SliceRect clearRect = depthBuffer->getRect();\r
 \r
-               if(scissorEnable)   // Clamp against scissor rectangle\r
+               if(scissorEnable)\r
                {\r
-                       if(x0 < scissorRect.x0) x0 = scissorRect.x0;\r
-                       if(y0 < scissorRect.y0) y0 = scissorRect.y0;\r
-                       if(width > scissorRect.x1 - scissorRect.x0) width = scissorRect.x1 - scissorRect.x0;\r
-                       if(height > scissorRect.y1 - scissorRect.y0) height = scissorRect.y1 - scissorRect.y0;\r
+                       clearRect.clip(scissorRect.x0, scissorRect.y0, scissorRect.x1, scissorRect.y1);\r
                }\r
 \r
-               depthBuffer->clearDepthBuffer(z, x0, y0, width, height);\r
+               depthBuffer->clearDepth(z, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());\r
        }\r
 \r
        void Device::clearStencil(unsigned int stencil, unsigned int mask)\r
@@ -209,20 +191,14 @@ namespace es1
                        return;\r
                }\r
 \r
-               int x0 = 0;\r
-               int y0 = 0;\r
-               int width = stencilBuffer->getWidth();\r
-               int height = stencilBuffer->getHeight();\r
+               sw::SliceRect clearRect = stencilBuffer->getRect();\r
 \r
-               if(scissorEnable)   // Clamp against scissor rectangle\r
+               if(scissorEnable)\r
                {\r
-                       if(x0 < scissorRect.x0) x0 = scissorRect.x0;\r
-                       if(y0 < scissorRect.y0) y0 = scissorRect.y0;\r
-                       if(width > scissorRect.x1 - scissorRect.x0) width = scissorRect.x1 - scissorRect.x0;\r
-                       if(height > scissorRect.y1 - scissorRect.y0) height = scissorRect.y1 - scissorRect.y0;\r
+                       clearRect.clip(scissorRect.x0, scissorRect.y0, scissorRect.x1, scissorRect.y1);\r
                }\r
 \r
-               stencilBuffer->clearStencilBuffer(stencil, mask, x0, y0, width, height);\r
+               stencilBuffer->clearStencil(stencil, mask, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());\r
        }\r
 \r
        egl::Image *Device::createDepthStencilSurface(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard)\r
index a62aa0e..f696b20 100644 (file)
@@ -2754,18 +2754,6 @@ void Context::applyScissor(int width, int height)
        }\r
 }\r
 \r
-egl::Image *Context::getScissoredImage(GLint drawbuffer, int &x0, int &y0, int &width, int &height, bool depthStencil)\r
-{\r
-       Framebuffer* framebuffer = getDrawFramebuffer();\r
-       egl::Image* image = depthStencil ? framebuffer->getDepthStencil() : framebuffer->getRenderTarget(drawbuffer);\r
-\r
-       applyScissor(image->getWidth(), image->getHeight());\r
-\r
-       device->getScissoredRegion(image, x0, y0, width, height);\r
-\r
-       return image;\r
-}\r
-\r
 // Applies the render target surface, depth stencil surface, viewport rectangle and scissor rectangle\r
 bool Context::applyRenderTarget()\r
 {\r
@@ -3407,18 +3395,24 @@ void Context::clear(GLbitfield mask)
 void Context::clearColorBuffer(GLint drawbuffer, void *value, sw::Format format)\r
 {\r
        unsigned int rgbaMask = getColorMask();\r
-       if(device && rgbaMask && !mState.rasterizerDiscardEnabled)\r
+       if(rgbaMask && !mState.rasterizerDiscardEnabled)\r
        {\r
-               int x0(0), y0(0), width(0), height(0);\r
-               egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, false);\r
+               Framebuffer *framebuffer = getDrawFramebuffer();\r
+               egl::Image *colorbuffer = framebuffer->getRenderTarget(drawbuffer);\r
 \r
-               sw::SliceRect sliceRect;\r
-               if(image->getClearRect(x0, y0, width, height, sliceRect))\r
+               if(colorbuffer)\r
                {\r
-                       device->clear(value, format, image, sliceRect, rgbaMask);\r
-               }\r
+                       sw::SliceRect clearRect = colorbuffer->getRect();\r
 \r
-               image->release();\r
+                       if(mState.scissorTestEnabled)\r
+                       {\r
+                               clearRect.clip(mState.scissorX, mState.scissorY, mState.scissorX + mState.scissorWidth, mState.scissorY + mState.scissorHeight);\r
+                       }\r
+\r
+                       device->clear(value, format, colorbuffer, clearRect, rgbaMask);\r
+\r
+                       colorbuffer->release();\r
+               }\r
        }\r
 }\r
 \r
@@ -3437,52 +3431,51 @@ void Context::clearColorBuffer(GLint drawbuffer, const GLfloat *value)
        clearColorBuffer(drawbuffer, (void*)value, sw::FORMAT_A32B32G32R32F);\r
 }\r
 \r
-void Context::clearDepthBuffer(GLint drawbuffer, const GLfloat *value)\r
+void Context::clearDepthBuffer(const GLfloat value)\r
 {\r
-       if(device && mState.depthMask && !mState.rasterizerDiscardEnabled)\r
+       if(mState.depthMask && !mState.rasterizerDiscardEnabled)\r
        {\r
-               int x0(0), y0(0), width(0), height(0);\r
-               egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, true);\r
-\r
-               float depth = clamp01(value[0]);\r
-               image->clearDepthBuffer(depth, x0, y0, width, height);\r
+               Framebuffer *framebuffer = getDrawFramebuffer();\r
+               egl::Image *depthbuffer = framebuffer->getDepthStencil();\r
 \r
-               image->release();\r
-       }\r
-}\r
+               if(depthbuffer)\r
+               {\r
+                       float depth = clamp01(value);\r
+                       sw::SliceRect clearRect = depthbuffer->getRect();\r
 \r
-void Context::clearStencilBuffer(GLint drawbuffer, const GLint *value)\r
-{\r
-       if(device && mState.stencilWritemask && !mState.rasterizerDiscardEnabled)\r
-       {\r
-               int x0(0), y0(0), width(0), height(0);\r
-               egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, true);\r
+                       if(mState.scissorTestEnabled)\r
+                       {\r
+                               clearRect.clip(mState.scissorX, mState.scissorY, mState.scissorX + mState.scissorWidth, mState.scissorY + mState.scissorHeight);\r
+                       }\r
 \r
-               unsigned char stencil = value[0] < 0 ? 0 : static_cast<unsigned char>(value[0] & 0x000000FF);\r
-               image->clearStencilBuffer(stencil, static_cast<unsigned char>(mState.stencilWritemask), x0, y0, width, height);\r
+                       depthbuffer->clearDepth(depth, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());\r
 \r
-               image->release();\r
+                       depthbuffer->release();\r
+               }\r
        }\r
 }\r
 \r
-void Context::clearDepthStencilBuffer(GLint drawbuffer, GLfloat depth, GLint stencil)\r
+void Context::clearStencilBuffer(const GLint value)\r
 {\r
-       if(device && (mState.depthMask || mState.stencilWritemask) && !mState.rasterizerDiscardEnabled)\r
+       if(mState.stencilWritemask && !mState.rasterizerDiscardEnabled)\r
        {\r
-               int x0(0), y0(0), width(0), height(0);\r
-               egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, true);\r
+               Framebuffer *framebuffer = getDrawFramebuffer();\r
+               egl::Image *stencilbuffer = framebuffer->getDepthStencil();\r
 \r
-               if(mState.stencilWritemask)\r
+               if(stencilbuffer)\r
                {\r
-                       image->clearStencilBuffer(static_cast<unsigned char>(stencil & 0x000000FF), static_cast<unsigned char>(mState.stencilWritemask), x0, y0, width, height);\r
-               }\r
+                       unsigned char stencil = value < 0 ? 0 : static_cast<unsigned char>(value & 0x000000FF);\r
+                       sw::SliceRect clearRect = stencilbuffer->getRect();\r
 \r
-               if(mState.depthMask)\r
-               {\r
-                       image->clearDepthBuffer(clamp01(depth), x0, y0, width, height);\r
-               }\r
+                       if(mState.scissorTestEnabled)\r
+                       {\r
+                               clearRect.clip(mState.scissorX, mState.scissorY, mState.scissorX + mState.scissorWidth, mState.scissorY + mState.scissorHeight);\r
+                       }\r
+\r
+                       stencilbuffer->clearStencil(stencil, static_cast<unsigned char>(mState.stencilWritemask), clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());\r
 \r
-               image->release();\r
+                       stencilbuffer->release();\r
+               }\r
        }\r
 }\r
 \r
index 5aa6f28..d8e90b6 100644 (file)
@@ -644,9 +644,8 @@ public:
     void clearColorBuffer(GLint drawbuffer, const GLint *value);\r
     void clearColorBuffer(GLint drawbuffer, const GLuint *value);\r
     void clearColorBuffer(GLint drawbuffer, const GLfloat *value);\r
-    void clearDepthBuffer(GLint drawbuffer, const GLfloat *value);\r
-    void clearStencilBuffer(GLint drawbuffer, const GLint *value);\r
-    void clearDepthStencilBuffer(GLint drawbuffer, GLfloat depth, GLint stencil);\r
+    void clearDepthBuffer(const GLfloat value);\r
+    void clearStencilBuffer(const GLint value);\r
     void drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount = 1);\r
     void drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLsizei instanceCount = 1);\r
     void finish();\r
@@ -677,7 +676,6 @@ public:
 private:\r
        virtual ~Context();\r
 \r
-       egl::Image *getScissoredImage(GLint drawbuffer, int &x0, int &y0, int &width, int &height, bool depthStencil);\r
        void applyScissor(int width, int height);\r
     bool applyRenderTarget();\r
     void applyState(GLenum drawMode);\r
index 27cb864..db7ad75 100644 (file)
@@ -173,22 +173,6 @@ namespace es2
                delete context;\r
        }\r
 \r
-       void Device::getScissoredRegion(egl::Image *sourceSurface, int &x0, int &y0, int& width, int& height) const\r
-       {\r
-               x0 = 0;\r
-               y0 = 0;\r
-               width = sourceSurface->getWidth();\r
-               height = sourceSurface->getHeight();\r
-\r
-               if(scissorEnable)   // Clamp against scissor rectangle\r
-               {\r
-                       if(x0 < scissorRect.x0) x0 = scissorRect.x0;\r
-                       if(y0 < scissorRect.y0) y0 = scissorRect.y0;\r
-                       if(width > scissorRect.x1 - scissorRect.x0) width = scissorRect.x1 - scissorRect.x0;\r
-                       if(height > scissorRect.y1 - scissorRect.y0) height = scissorRect.y1 - scissorRect.y0;\r
-               }\r
-       }\r
-\r
        void Device::clearColor(float red, float green, float blue, float alpha, unsigned int rgbaMask)\r
        {\r
                if(!rgbaMask)\r
@@ -206,17 +190,17 @@ namespace es2
                {\r
                        if(renderTarget[i])\r
                        {\r
-                               int x0(0), y0(0), width(0), height(0);\r
-                               getScissoredRegion(renderTarget[i], x0, y0, width, height);\r
+                               sw::SliceRect clearRect = renderTarget[i]->getRect();\r
 \r
-                               sw::SliceRect sliceRect;\r
-                               if(renderTarget[i]->getClearRect(x0, y0, width, height, sliceRect))\r
+                               if(scissorEnable)\r
                                {\r
-                                       int depth = sw::max(renderTarget[i]->getDepth(), 1);\r
-                                       for(sliceRect.slice = 0; sliceRect.slice < depth; ++sliceRect.slice)\r
-                                       {\r
-                                               clear(rgba, FORMAT_A32B32G32R32F, renderTarget[i], sliceRect, rgbaMask);\r
-                                       }\r
+                                       clearRect.clip(scissorRect.x0, scissorRect.y0, scissorRect.x1, scissorRect.y1);\r
+                               }\r
+\r
+                               int depth = sw::max(renderTarget[i]->getDepth(), 1);\r
+                               for(clearRect.slice = 0; clearRect.slice < depth; clearRect.slice++)\r
+                               {\r
+                                       clear(rgba, FORMAT_A32B32G32R32F, renderTarget[i], clearRect, rgbaMask);\r
                                }\r
                        }\r
                }\r
@@ -229,13 +213,15 @@ namespace es2
                        return;\r
                }\r
 \r
-               if(z > 1) z = 1;\r
-               if(z < 0) z = 0;\r
+               z = clamp01(z);\r
+               sw::SliceRect clearRect = depthBuffer->getRect();\r
 \r
-               int x0(0), y0(0), width(0), height(0);\r
-               getScissoredRegion(depthBuffer, x0, y0, width, height);\r
+               if(scissorEnable)\r
+               {\r
+                       clearRect.clip(scissorRect.x0, scissorRect.y0, scissorRect.x1, scissorRect.y1);\r
+               }\r
 \r
-               depthBuffer->clearDepthBuffer(z, x0, y0, width, height);\r
+               depthBuffer->clearDepth(z, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());\r
        }\r
 \r
        void Device::clearStencil(unsigned int stencil, unsigned int mask)\r
@@ -245,10 +231,14 @@ namespace es2
                        return;\r
                }\r
 \r
-               int x0(0), y0(0), width(0), height(0);\r
-               getScissoredRegion(stencilBuffer, x0, y0, width, height);\r
+               sw::SliceRect clearRect = stencilBuffer->getRect();\r
+\r
+               if(scissorEnable)\r
+               {\r
+                       clearRect.clip(scissorRect.x0, scissorRect.y0, scissorRect.x1, scissorRect.y1);\r
+               }\r
 \r
-               stencilBuffer->clearStencilBuffer(stencil, mask, x0, y0, width, height);\r
+               stencilBuffer->clearStencil(stencil, mask, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());\r
        }\r
 \r
        egl::Image *Device::createDepthStencilSurface(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard)\r
index f4034de..d254d3b 100644 (file)
@@ -62,8 +62,6 @@ namespace es2
                virtual bool stretchCube(sw::Surface *sourceSurface, sw::Surface *destSurface);\r
                virtual void finish();\r
 \r
-               void getScissoredRegion(egl::Image *sourceSurface, int &x0, int &y0, int& width, int& height) const;\r
-\r
        private:\r
                sw::Context *const context;\r
 \r
index c69fd35..f8c58ab 100644 (file)
@@ -2586,7 +2586,7 @@ GL_APICALL void GL_APIENTRY glClearBufferiv(GLenum buffer, GLint drawbuffer, con
                        }\r
                        else\r
                        {\r
-                               context->clearStencilBuffer(drawbuffer, value);\r
+                               context->clearStencilBuffer(value[0]);\r
                        }\r
                        break;\r
                default:\r
@@ -2650,7 +2650,7 @@ GL_APICALL void GL_APIENTRY glClearBufferfv(GLenum buffer, GLint drawbuffer, con
                        }\r
                        else\r
                        {\r
-                               context->clearDepthBuffer(drawbuffer, value);\r
+                               context->clearDepthBuffer(value[0]);\r
                        }\r
                        break;\r
                default:\r
@@ -2677,7 +2677,8 @@ GL_APICALL void GL_APIENTRY glClearBufferfi(GLenum buffer, GLint drawbuffer, GLf
                        }\r
                        else\r
                        {\r
-                               context->clearDepthStencilBuffer(drawbuffer, depth, stencil);\r
+                               context->clearDepthBuffer(depth);\r
+                               context->clearStencilBuffer(stencil);\r
                        }\r
                        break;\r
                default:\r
index af2c7c9..9e739d9 100644 (file)
@@ -387,7 +387,7 @@ namespace sw
                                ASSERT(palette);
 
                                unsigned int abgr = palette[*(unsigned char*)element];
-                               
+
                                r = (abgr & 0x000000FF) * (1.0f / 0x000000FF);
                                g = (abgr & 0x0000FF00) * (1.0f / 0x0000FF00);
                                b = (abgr & 0x00FF0000) * (1.0f / 0x00FF0000);
@@ -399,7 +399,7 @@ namespace sw
                                ASSERT(palette);
 
                                unsigned int bgr = palette[((unsigned char*)element)[0]];
-                               
+
                                r = (bgr & 0x000000FF) * (1.0f / 0x000000FF);
                                g = (bgr & 0x0000FF00) * (1.0f / 0x0000FF00);
                                b = (bgr & 0x00FF0000) * (1.0f / 0x00FF0000);
@@ -427,7 +427,7 @@ namespace sw
                case FORMAT_R3G3B2:
                        {
                                unsigned char rgb = *(unsigned char*)element;
-                               
+
                                r = (rgb & 0xE0) * (1.0f / 0xE0);
                                g = (rgb & 0x1C) * (1.0f / 0x1C);
                                b = (rgb & 0x03) * (1.0f / 0x03);
@@ -436,7 +436,7 @@ namespace sw
                case FORMAT_A8R3G3B2:
                        {
                                unsigned short argb = *(unsigned short*)element;
-                               
+
                                a = (argb & 0xFF00) * (1.0f / 0xFF00);
                                r = (argb & 0x00E0) * (1.0f / 0x00E0);
                                g = (argb & 0x001C) * (1.0f / 0x001C);
@@ -446,7 +446,7 @@ namespace sw
                case FORMAT_X4R4G4B4:
                        {
                                unsigned short rgb = *(unsigned short*)element;
-                               
+
                                r = (rgb & 0x0F00) * (1.0f / 0x0F00);
                                g = (rgb & 0x00F0) * (1.0f / 0x00F0);
                                b = (rgb & 0x000F) * (1.0f / 0x000F);
@@ -455,7 +455,7 @@ namespace sw
                case FORMAT_A4R4G4B4:
                        {
                                unsigned short argb = *(unsigned short*)element;
-                               
+
                                a = (argb & 0xF000) * (1.0f / 0xF000);
                                r = (argb & 0x0F00) * (1.0f / 0x0F00);
                                g = (argb & 0x00F0) * (1.0f / 0x00F0);
@@ -465,7 +465,7 @@ namespace sw
                case FORMAT_R4G4B4A4:
                        {
                                unsigned short rgba = *(unsigned short*)element;
-                               
+
                                r = (rgba & 0xF000) * (1.0f / 0xF000);
                                g = (rgba & 0x0F00) * (1.0f / 0x0F00);
                                b = (rgba & 0x00F0) * (1.0f / 0x00F0);
@@ -475,7 +475,7 @@ namespace sw
                case FORMAT_R5G6B5:
                        {
                                unsigned short rgb = *(unsigned short*)element;
-                               
+
                                r = (rgb & 0xF800) * (1.0f / 0xF800);
                                g = (rgb & 0x07E0) * (1.0f / 0x07E0);
                                b = (rgb & 0x001F) * (1.0f / 0x001F);
@@ -484,7 +484,7 @@ namespace sw
                case FORMAT_A1R5G5B5:
                        {
                                unsigned short argb = *(unsigned short*)element;
-                               
+
                                a = (argb & 0x8000) * (1.0f / 0x8000);
                                r = (argb & 0x7C00) * (1.0f / 0x7C00);
                                g = (argb & 0x03E0) * (1.0f / 0x03E0);
@@ -494,7 +494,7 @@ namespace sw
                case FORMAT_R5G5B5A1:
                        {
                                unsigned short rgba = *(unsigned short*)element;
-                               
+
                                r = (rgba & 0xF800) * (1.0f / 0xF800);
                                g = (rgba & 0x07C0) * (1.0f / 0x07C0);
                                b = (rgba & 0x003E) * (1.0f / 0x003E);
@@ -504,7 +504,7 @@ namespace sw
                case FORMAT_X1R5G5B5:
                        {
                                unsigned short xrgb = *(unsigned short*)element;
-                               
+
                                r = (xrgb & 0x7C00) * (1.0f / 0x7C00);
                                g = (xrgb & 0x03E0) * (1.0f / 0x03E0);
                                b = (xrgb & 0x001F) * (1.0f / 0x001F);
@@ -513,7 +513,7 @@ namespace sw
                case FORMAT_A8R8G8B8:
                        {
                                unsigned int argb = *(unsigned int*)element;
-                               
+
                                a = (argb & 0xFF000000) * (1.0f / 0xFF000000);
                                r = (argb & 0x00FF0000) * (1.0f / 0x00FF0000);
                                g = (argb & 0x0000FF00) * (1.0f / 0x0000FF00);
@@ -523,7 +523,7 @@ namespace sw
                case FORMAT_X8R8G8B8:
                        {
                                unsigned int xrgb = *(unsigned int*)element;
-                               
+
                                r = (xrgb & 0x00FF0000) * (1.0f / 0x00FF0000);
                                g = (xrgb & 0x0000FF00) * (1.0f / 0x0000FF00);
                                b = (xrgb & 0x000000FF) * (1.0f / 0x000000FF);
@@ -532,7 +532,7 @@ namespace sw
                case FORMAT_A8B8G8R8I_SNORM:
                        {
                                signed char* abgr = (signed char*)element;
-                               
+
                                r = max(abgr[0] * (1.0f / 0x7F), -1.0f);
                                g = max(abgr[1] * (1.0f / 0x7F), -1.0f);
                                b = max(abgr[2] * (1.0f / 0x7F), -1.0f);
@@ -542,7 +542,7 @@ namespace sw
                case FORMAT_A8B8G8R8:
                        {
                                unsigned int abgr = *(unsigned int*)element;
-                               
+
                                a = (abgr & 0xFF000000) * (1.0f / 0xFF000000);
                                b = (abgr & 0x00FF0000) * (1.0f / 0x00FF0000);
                                g = (abgr & 0x0000FF00) * (1.0f / 0x0000FF00);
@@ -552,7 +552,7 @@ namespace sw
                case FORMAT_A8B8G8R8I:
                        {
                                signed char* abgr = (signed char*)element;
-                               
+
                                r = abgr[0];
                                g = abgr[1];
                                b = abgr[2];
@@ -572,7 +572,7 @@ namespace sw
                case FORMAT_X8B8G8R8I_SNORM:
                        {
                                signed char* bgr = (signed char*)element;
-                               
+
                                r = max(bgr[0] * (1.0f / 0x7F), -1.0f);
                                g = max(bgr[1] * (1.0f / 0x7F), -1.0f);
                                b = max(bgr[2] * (1.0f / 0x7F), -1.0f);
@@ -581,7 +581,7 @@ namespace sw
                case FORMAT_X8B8G8R8:
                        {
                                unsigned int xbgr = *(unsigned int*)element;
-                               
+
                                b = (xbgr & 0x00FF0000) * (1.0f / 0x00FF0000);
                                g = (xbgr & 0x0000FF00) * (1.0f / 0x0000FF00);
                                r = (xbgr & 0x000000FF) * (1.0f / 0x000000FF);
@@ -590,7 +590,7 @@ namespace sw
                case FORMAT_X8B8G8R8I:
                        {
                                signed char* bgr = (signed char*)element;
-                               
+
                                r = bgr[0];
                                g = bgr[1];
                                b = bgr[2];
@@ -608,7 +608,7 @@ namespace sw
                case FORMAT_G8R8I_SNORM:
                        {
                                signed char* gr = (signed char*)element;
-                               
+
                                r = (gr[0] & 0xFF00) * (1.0f / 0xFF00);
                                g = (gr[1] & 0x00FF) * (1.0f / 0x00FF);
                        }
@@ -616,7 +616,7 @@ namespace sw
                case FORMAT_G8R8:
                        {
                                unsigned short gr = *(unsigned short*)element;
-                               
+
                                g = (gr & 0xFF00) * (1.0f / 0xFF00);
                                r = (gr & 0x00FF) * (1.0f / 0x00FF);
                        }
@@ -624,7 +624,7 @@ namespace sw
                case FORMAT_G8R8I:
                        {
                                signed char* gr = (signed char*)element;
-                               
+
                                r = gr[0];
                                g = gr[1];
                        }
@@ -632,7 +632,7 @@ namespace sw
                case FORMAT_G8R8UI:
                        {
                                unsigned char* gr = (unsigned char*)element;
-                               
+
                                r = gr[0];
                                g = gr[1];
                        }
@@ -646,7 +646,7 @@ namespace sw
                case FORMAT_G16R16I:
                        {
                                short* gr = (short*)element;
-                               
+
                                r = gr[0];
                                g = gr[1];
                        }
@@ -654,7 +654,7 @@ namespace sw
                case FORMAT_G16R16:
                        {
                                unsigned int gr = *(unsigned int*)element;
-                               
+
                                g = (gr & 0xFFFF0000) * (1.0f / 0xFFFF0000);
                                r = (gr & 0x0000FFFF) * (1.0f / 0x0000FFFF);
                        }
@@ -662,7 +662,7 @@ namespace sw
                case FORMAT_G16R16UI:
                        {
                                unsigned short* gr = (unsigned short*)element;
-                               
+
                                r = gr[0];
                                g = gr[1];
                        }
@@ -670,7 +670,7 @@ namespace sw
                case FORMAT_A2R10G10B10:
                        {
                                unsigned int argb = *(unsigned int*)element;
-                               
+
                                a = (argb & 0xC0000000) * (1.0f / 0xC0000000);
                                r = (argb & 0x3FF00000) * (1.0f / 0x3FF00000);
                                g = (argb & 0x000FFC00) * (1.0f / 0x000FFC00);
@@ -680,7 +680,7 @@ namespace sw
                case FORMAT_A2B10G10R10:
                        {
                                unsigned int abgr = *(unsigned int*)element;
-                               
+
                                a = (abgr & 0xC0000000) * (1.0f / 0xC0000000);
                                b = (abgr & 0x3FF00000) * (1.0f / 0x3FF00000);
                                g = (abgr & 0x000FFC00) * (1.0f / 0x000FFC00);
@@ -690,7 +690,7 @@ namespace sw
                case FORMAT_A16B16G16R16I:
                        {
                                short* abgr = (short*)element;
-                               
+
                                r = abgr[0];
                                g = abgr[1];
                                b = abgr[2];
@@ -706,7 +706,7 @@ namespace sw
                case FORMAT_A16B16G16R16UI:
                        {
                                unsigned short* abgr = (unsigned short*)element;
-                               
+
                                r = abgr[0];
                                g = abgr[1];
                                b = abgr[2];
@@ -716,7 +716,7 @@ namespace sw
                case FORMAT_X16B16G16R16I:
                        {
                                short* bgr = (short*)element;
-                               
+
                                r = bgr[0];
                                g = bgr[1];
                                b = bgr[2];
@@ -725,7 +725,7 @@ namespace sw
                case FORMAT_X16B16G16R16UI:
                        {
                                unsigned short* bgr = (unsigned short*)element;
-                               
+
                                r = bgr[0];
                                g = bgr[1];
                                b = bgr[2];
@@ -734,7 +734,7 @@ namespace sw
                case FORMAT_A32B32G32R32I:
                        {
                                int* abgr = (int*)element;
-                               
+
                                r = static_cast<float>(abgr[0]);
                                g = static_cast<float>(abgr[1]);
                                b = static_cast<float>(abgr[2]);
@@ -744,7 +744,7 @@ namespace sw
                case FORMAT_A32B32G32R32UI:
                        {
                                unsigned int* abgr = (unsigned int*)element;
-                               
+
                                r = static_cast<float>(abgr[0]);
                                g = static_cast<float>(abgr[1]);
                                b = static_cast<float>(abgr[2]);
@@ -754,7 +754,7 @@ namespace sw
                case FORMAT_X32B32G32R32I:
                        {
                                int* bgr = (int*)element;
-                               
+
                                r = static_cast<float>(bgr[0]);
                                g = static_cast<float>(bgr[1]);
                                b = static_cast<float>(bgr[2]);
@@ -763,7 +763,7 @@ namespace sw
                case FORMAT_X32B32G32R32UI:
                        {
                                unsigned int* bgr = (unsigned int*)element;
-                               
+
                                r = static_cast<float>(bgr[0]);
                                g = static_cast<float>(bgr[1]);
                                b = static_cast<float>(bgr[2]);
@@ -772,7 +772,7 @@ namespace sw
                case FORMAT_G32R32I:
                        {
                                int* gr = (int*)element;
-                               
+
                                r = static_cast<float>(gr[0]);
                                g = static_cast<float>(gr[1]);
                        }
@@ -780,7 +780,7 @@ namespace sw
                case FORMAT_G32R32UI:
                        {
                                unsigned int* gr = (unsigned int*)element;
-                               
+
                                r = static_cast<float>(gr[0]);
                                g = static_cast<float>(gr[1]);
                        }
@@ -802,7 +802,7 @@ namespace sw
                case FORMAT_L6V5U5:
                        {
                                unsigned short lvu = *(unsigned short*)element;
-                               
+
                                r = ((int)(lvu & 0x001F) << 27) * (1.0f / 0x78000000);
                                g = ((int)(lvu & 0x03E0) << 22) * (1.0f / 0x78000000);
                                b = (lvu & 0xFC00) * (1.0f / 0xFC00);
@@ -811,7 +811,7 @@ namespace sw
                case FORMAT_Q8W8V8U8:
                        {
                                unsigned int qwvu = *(unsigned int*)element;
-                               
+
                                r = ((int)(qwvu & 0x000000FF) << 24) * (1.0f / 0x7F000000);
                                g = ((int)(qwvu & 0x0000FF00) << 16) * (1.0f / 0x7F000000);
                                b = ((int)(qwvu & 0x00FF0000) << 8)  * (1.0f / 0x7F000000);
@@ -821,7 +821,7 @@ namespace sw
                case FORMAT_X8L8V8U8:
                        {
                                unsigned int xlvu = *(unsigned int*)element;
-                               
+
                                r = ((int)(xlvu & 0x000000FF) << 24) * (1.0f / 0x7F000000);
                                g = ((int)(xlvu & 0x0000FF00) << 16) * (1.0f / 0x7F000000);
                                b = (xlvu & 0x00FF0000) * (1.0f / 0x00FF0000);
@@ -840,7 +840,7 @@ namespace sw
                case FORMAT_V16U16:
                        {
                                unsigned int vu = *(unsigned int*)element;
-                               
+
                                r = ((int)(vu & 0x0000FFFF) << 16) * (1.0f / 0x7FFF0000);
                                g = ((int)(vu & 0xFFFF0000) << 0)  * (1.0f / 0x7FFF0000);
                        }
@@ -848,7 +848,7 @@ namespace sw
                case FORMAT_A2W10V10U10:
                        {
                                unsigned int awvu = *(unsigned int*)element;
-                               
+
                                r = ((int)(awvu & 0x000003FF) << 22) * (1.0f / 0x7FC00000);
                                g = ((int)(awvu & 0x000FFC00) << 12) * (1.0f / 0x7FC00000);
                                b = ((int)(awvu & 0x3FF00000) << 2)  * (1.0f / 0x7FC00000);
@@ -875,7 +875,7 @@ namespace sw
                case FORMAT_A4L4:
                        {
                                unsigned char al = *(unsigned char*)element;
-                               
+
                                r =
                                g =
                                b = (al & 0x0F) * (1.0f / 0x0F);
@@ -1755,7 +1755,7 @@ namespace sw
        {
        //      ASSERT(source.lock != LOCK_UNLOCKED);
        //      ASSERT(destination.lock != LOCK_UNLOCKED);
-               
+
                if(destination.buffer != source.buffer)
                {
                        ASSERT(source.dirty && !destination.dirty);
@@ -1918,7 +1918,7 @@ namespace sw
                                for(int x = 0; x < destination.width && x < source.width; x++)
                                {
                                        unsigned int xrgb = *(unsigned short*)sourceElement;
-                                               
+
                                        unsigned int r = (((xrgb & 0x7C00) * 134771 + 0x800000) >> 8) & 0x00FF0000;
                                        unsigned int g = (((xrgb & 0x03E0) * 16846 + 0x8000) >> 8) & 0x0000FF00;
                                        unsigned int b = (((xrgb & 0x001F) * 2106  + 0x80) >> 8);
@@ -1956,7 +1956,7 @@ namespace sw
                                for(int x = 0; x < destination.width && x < source.width; x++)
                                {
                                        unsigned int argb = *(unsigned short*)sourceElement;
-                                       
+
                                        unsigned int a =   (argb & 0x8000) * 130560;
                                        unsigned int r = (((argb & 0x7C00) * 134771 + 0x800000) >> 8) & 0x00FF0000;
                                        unsigned int g = (((argb & 0x03E0) * 16846  + 0x8000) >> 8) & 0x0000FF00;
@@ -1995,7 +1995,7 @@ namespace sw
                                for(int x = 0; x < destination.width && x < source.width; x++)
                                {
                                        unsigned int xrgb = *(unsigned short*)sourceElement;
-                                               
+
                                        unsigned int r = ((xrgb & 0x0F00) * 0x00001100) & 0x00FF0000;
                                        unsigned int g = ((xrgb & 0x00F0) * 0x00000110) & 0x0000FF00;
                                        unsigned int b =  (xrgb & 0x000F) * 0x00000011;
@@ -2033,7 +2033,7 @@ namespace sw
                                for(int x = 0; x < destination.width && x < source.width; x++)
                                {
                                        unsigned int argb = *(unsigned short*)sourceElement;
-                                       
+
                                        unsigned int a = ((argb & 0xF000) * 0x00011000) & 0xFF000000;
                                        unsigned int r = ((argb & 0x0F00) * 0x00001100) & 0x00FF0000;
                                        unsigned int g = ((argb & 0x00F0) * 0x00000110) & 0x0000FF00;
@@ -2235,7 +2235,7 @@ namespace sw
 
                                        a[0] = source->a0;
                                        a[1] = source->a1;
-                                       
+
                                        if(a[0] > a[1])
                                        {
                                                a[2] = (byte)((6 * (word)a[0] + 1 * (word)a[1] + 3) / 7);
@@ -2261,7 +2261,7 @@ namespace sw
                                                {
                                                        unsigned int alpha = (unsigned int)a[(unsigned int)(source->alut >> (16 + 3 * (i + j * 4))) % 8] << 24;
                                                        unsigned int color = (c[(source->clut >> 2 * (i + j * 4)) % 4] & 0x00FFFFFF) | alpha;
-                                                       
+
                                                        dest[(x + i) + (y + j) * internal.width] = color;
                                                }
                                        }
@@ -2292,7 +2292,7 @@ namespace sw
 
                                        r[0] = source->r0;
                                        r[1] = source->r1;
-                                       
+
                                        if(r[0] > r[1])
                                        {
                                                r[2] = (byte)((6 * (word)r[0] + 1 * (word)r[1] + 3) / 7);
@@ -2345,7 +2345,7 @@ namespace sw
 
                                        X[0] = source->x0;
                                        X[1] = source->x1;
-                                       
+
                                        if(X[0] > X[1])
                                        {
                                                X[2] = (byte)((6 * (word)X[0] + 1 * (word)X[1] + 3) / 7);
@@ -2369,7 +2369,7 @@ namespace sw
 
                                        Y[0] = source->y0;
                                        Y[1] = source->y1;
-                                       
+
                                        if(Y[0] > Y[1])
                                        {
                                                Y[2] = (byte)((6 * (word)Y[0] + 1 * (word)Y[1] + 3) / 7);
@@ -2704,7 +2704,7 @@ namespace sw
                default:
                        ASSERT(false);
                }
-               
+
                return false;
        }
 
@@ -2782,7 +2782,7 @@ namespace sw
                default:
                        ASSERT(false);
                }
-               
+
                return false;
        }
 
@@ -3030,7 +3030,7 @@ namespace sw
                        }
 
                        __m128 quad = _mm_set_ps1((float&)pattern);
-                       
+
                        float *pointer = (float*)buffer;
                        int qxwords = bytes / 64;
                        bytes -= qxwords * 64;
@@ -3075,29 +3075,12 @@ namespace sw
                return (rect.x0 == 0 && rect.y0 == 0 && rect.x1 == internal.width && rect.y1 == internal.height && internal.depth == 1);
        }
 
-       bool Surface::getClearRect(int x0, int y0, int width, int height, SliceRect& rect) const
+       SliceRect Surface::getRect() const
        {
-               // Not overlapping
-               if(x0 > internal.width) return false;
-               if(y0 > internal.height) return false;
-               if(x0 + width < 0) return false;
-               if(y0 + height < 0) return false;
-
-               // Clip against dimensions
-               if(x0 < 0) { width += x0; x0 = 0; }
-               if(x0 + width > internal.width) width = internal.width - x0;
-               if(y0 < 0) { height += y0; y0 = 0; }
-               if(y0 + height > internal.height) height = internal.height - y0;
-
-               rect.x0 = x0;
-               rect.x1 = x0 + width;
-               rect.y0 = y0;
-               rect.y1 = y0 + height;
-
-               return true;
+               return SliceRect(0, 0, internal.width, internal.height, 0);
        }
 
-       void Surface::clearDepthBuffer(float depth, int x0, int y0, int width, int height)
+       void Surface::clearDepth(float depth, int x0, int y0, int width, int height)
        {
                if(width == 0 || height == 0) return;
 
@@ -3157,7 +3140,7 @@ namespace sw
                                for(int y = y0; y < y1; y++)
                                {
                                        float *target = buffer + (y & ~1) * width2 + (y & 1) * 2;
-                       
+
                                        if((y & 1) == 0 && y + 1 < y1)   // Fill quad line at once
                                        {
                                                if((x0 & 1) != 0)
@@ -3222,7 +3205,7 @@ namespace sw
                }
        }
 
-       void Surface::clearStencilBuffer(unsigned char s, unsigned char mask, int x0, int y0, int width, int height)
+       void Surface::clearStencil(unsigned char s, unsigned char mask, int x0, int y0, int width, int height)
        {
                if(mask == 0 || width == 0 || height == 0) return;
 
@@ -3299,7 +3282,7 @@ namespace sw
        {
                unsigned char *row;
                Buffer *buffer;
-               
+
                if(internal.dirty)
                {
                        row = (unsigned char*)lockInternal(x0, y0, 0, LOCK_WRITEONLY, PUBLIC);
@@ -3393,7 +3376,7 @@ namespace sw
        {
                return isStencil(external.format);
        }
-       
+
        bool Surface::hasDepth() const
        {
                return isDepth(external.format);
@@ -3708,7 +3691,7 @@ namespace sw
                                                {
                                                        __m128i c0 = _mm_load_si128((__m128i*)(source0 + 4 * x));
                                                        __m128i c1 = _mm_load_si128((__m128i*)(source1 + 4 * x));
-                                                       
+
                                                        c0 = _mm_avg_epu8(c0, c1);
 
                                                        _mm_store_si128((__m128i*)(source0 + 4 * x), c0);
@@ -3728,7 +3711,7 @@ namespace sw
                                                        __m128i c1 = _mm_load_si128((__m128i*)(source1 + 4 * x));
                                                        __m128i c2 = _mm_load_si128((__m128i*)(source2 + 4 * x));
                                                        __m128i c3 = _mm_load_si128((__m128i*)(source3 + 4 * x));
-                                                       
+
                                                        c0 = _mm_avg_epu8(c0, c1);
                                                        c2 = _mm_avg_epu8(c2, c3);
                                                        c0 = _mm_avg_epu8(c0, c2);
@@ -3756,7 +3739,7 @@ namespace sw
                                                        __m128i c5 = _mm_load_si128((__m128i*)(source5 + 4 * x));
                                                        __m128i c6 = _mm_load_si128((__m128i*)(source6 + 4 * x));
                                                        __m128i c7 = _mm_load_si128((__m128i*)(source7 + 4 * x));
-                                                       
+
                                                        c0 = _mm_avg_epu8(c0, c1);
                                                        c2 = _mm_avg_epu8(c2, c3);
                                                        c4 = _mm_avg_epu8(c4, c5);
@@ -3999,7 +3982,7 @@ namespace sw
                                                {
                                                        __m128i c0 = _mm_load_si128((__m128i*)(source0 + 4 * x));
                                                        __m128i c1 = _mm_load_si128((__m128i*)(source1 + 4 * x));
-                                                       
+
                                                        c0 = _mm_avg_epu16(c0, c1);
 
                                                        _mm_store_si128((__m128i*)(source0 + 4 * x), c0);
@@ -4019,7 +4002,7 @@ namespace sw
                                                        __m128i c1 = _mm_load_si128((__m128i*)(source1 + 4 * x));
                                                        __m128i c2 = _mm_load_si128((__m128i*)(source2 + 4 * x));
                                                        __m128i c3 = _mm_load_si128((__m128i*)(source3 + 4 * x));
-                                                       
+
                                                        c0 = _mm_avg_epu16(c0, c1);
                                                        c2 = _mm_avg_epu16(c2, c3);
                                                        c0 = _mm_avg_epu16(c0, c2);
@@ -4047,7 +4030,7 @@ namespace sw
                                                        __m128i c5 = _mm_load_si128((__m128i*)(source5 + 4 * x));
                                                        __m128i c6 = _mm_load_si128((__m128i*)(source6 + 4 * x));
                                                        __m128i c7 = _mm_load_si128((__m128i*)(source7 + 4 * x));
-                                                       
+
                                                        c0 = _mm_avg_epu16(c0, c1);
                                                        c2 = _mm_avg_epu16(c2, c3);
                                                        c4 = _mm_avg_epu16(c4, c5);
@@ -4290,7 +4273,7 @@ namespace sw
                                                {
                                                        __m128i c0 = _mm_load_si128((__m128i*)(source0 + 8 * x));
                                                        __m128i c1 = _mm_load_si128((__m128i*)(source1 + 8 * x));
-                                                       
+
                                                        c0 = _mm_avg_epu16(c0, c1);
 
                                                        _mm_store_si128((__m128i*)(source0 + 8 * x), c0);
@@ -4310,7 +4293,7 @@ namespace sw
                                                        __m128i c1 = _mm_load_si128((__m128i*)(source1 + 8 * x));
                                                        __m128i c2 = _mm_load_si128((__m128i*)(source2 + 8 * x));
                                                        __m128i c3 = _mm_load_si128((__m128i*)(source3 + 8 * x));
-                                                       
+
                                                        c0 = _mm_avg_epu16(c0, c1);
                                                        c2 = _mm_avg_epu16(c2, c3);
                                                        c0 = _mm_avg_epu16(c0, c2);
@@ -4338,7 +4321,7 @@ namespace sw
                                                        __m128i c5 = _mm_load_si128((__m128i*)(source5 + 8 * x));
                                                        __m128i c6 = _mm_load_si128((__m128i*)(source6 + 8 * x));
                                                        __m128i c7 = _mm_load_si128((__m128i*)(source7 + 8 * x));
-                                                       
+
                                                        c0 = _mm_avg_epu16(c0, c1);
                                                        c2 = _mm_avg_epu16(c2, c3);
                                                        c4 = _mm_avg_epu16(c4, c5);
@@ -4581,9 +4564,9 @@ namespace sw
                                                {
                                                        __m128 c0 = _mm_load_ps((float*)(source0 + 4 * x));
                                                        __m128 c1 = _mm_load_ps((float*)(source1 + 4 * x));
-                                                       
+
                                                        c0 = _mm_add_ps(c0, c1);
-                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 2.0f)); 
+                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 2.0f));
 
                                                        _mm_store_ps((float*)(source0 + 4 * x), c0);
                                                }
@@ -4602,11 +4585,11 @@ namespace sw
                                                        __m128 c1 = _mm_load_ps((float*)(source1 + 4 * x));
                                                        __m128 c2 = _mm_load_ps((float*)(source2 + 4 * x));
                                                        __m128 c3 = _mm_load_ps((float*)(source3 + 4 * x));
-                                                       
+
                                                        c0 = _mm_add_ps(c0, c1);
                                                        c2 = _mm_add_ps(c2, c3);
                                                        c0 = _mm_add_ps(c0, c2);
-                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 4.0f)); 
+                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 4.0f));
 
                                                        _mm_store_ps((float*)(source0 + 4 * x), c0);
                                                }
@@ -4631,7 +4614,7 @@ namespace sw
                                                        __m128 c5 = _mm_load_ps((float*)(source5 + 4 * x));
                                                        __m128 c6 = _mm_load_ps((float*)(source6 + 4 * x));
                                                        __m128 c7 = _mm_load_ps((float*)(source7 + 4 * x));
-                                                       
+
                                                        c0 = _mm_add_ps(c0, c1);
                                                        c2 = _mm_add_ps(c2, c3);
                                                        c4 = _mm_add_ps(c4, c5);
@@ -4639,7 +4622,7 @@ namespace sw
                                                        c0 = _mm_add_ps(c0, c2);
                                                        c4 = _mm_add_ps(c4, c6);
                                                        c0 = _mm_add_ps(c0, c4);
-                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 8.0f)); 
+                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 8.0f));
 
                                                        _mm_store_ps((float*)(source0 + 4 * x), c0);
                                                }
@@ -4692,7 +4675,7 @@ namespace sw
                                                        c0 = _mm_add_ps(c0, c4);
                                                        c8 = _mm_add_ps(c8, cC);
                                                        c0 = _mm_add_ps(c0, c8);
-                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 16.0f)); 
+                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 16.0f));
 
                                                        _mm_store_ps((float*)(source0 + 4 * x), c0);
                                                }
@@ -4876,9 +4859,9 @@ namespace sw
                                                {
                                                        __m128 c0 = _mm_load_ps((float*)(source0 + 8 * x));
                                                        __m128 c1 = _mm_load_ps((float*)(source1 + 8 * x));
-                                                       
+
                                                        c0 = _mm_add_ps(c0, c1);
-                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 2.0f)); 
+                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 2.0f));
 
                                                        _mm_store_ps((float*)(source0 + 8 * x), c0);
                                                }
@@ -4897,11 +4880,11 @@ namespace sw
                                                        __m128 c1 = _mm_load_ps((float*)(source1 + 8 * x));
                                                        __m128 c2 = _mm_load_ps((float*)(source2 + 8 * x));
                                                        __m128 c3 = _mm_load_ps((float*)(source3 + 8 * x));
-                                                       
+
                                                        c0 = _mm_add_ps(c0, c1);
                                                        c2 = _mm_add_ps(c2, c3);
                                                        c0 = _mm_add_ps(c0, c2);
-                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 4.0f)); 
+                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 4.0f));
 
                                                        _mm_store_ps((float*)(source0 + 8 * x), c0);
                                                }
@@ -4926,7 +4909,7 @@ namespace sw
                                                        __m128 c5 = _mm_load_ps((float*)(source5 + 8 * x));
                                                        __m128 c6 = _mm_load_ps((float*)(source6 + 8 * x));
                                                        __m128 c7 = _mm_load_ps((float*)(source7 + 8 * x));
-                                                       
+
                                                        c0 = _mm_add_ps(c0, c1);
                                                        c2 = _mm_add_ps(c2, c3);
                                                        c4 = _mm_add_ps(c4, c5);
@@ -4934,7 +4917,7 @@ namespace sw
                                                        c0 = _mm_add_ps(c0, c2);
                                                        c4 = _mm_add_ps(c4, c6);
                                                        c0 = _mm_add_ps(c0, c4);
-                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 8.0f)); 
+                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 8.0f));
 
                                                        _mm_store_ps((float*)(source0 + 8 * x), c0);
                                                }
@@ -4987,7 +4970,7 @@ namespace sw
                                                        c0 = _mm_add_ps(c0, c4);
                                                        c8 = _mm_add_ps(c8, cC);
                                                        c0 = _mm_add_ps(c0, c8);
-                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 16.0f)); 
+                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 16.0f));
 
                                                        _mm_store_ps((float*)(source0 + 8 * x), c0);
                                                }
@@ -5171,9 +5154,9 @@ namespace sw
                                                {
                                                        __m128 c0 = _mm_load_ps((float*)(source0 + 16 * x));
                                                        __m128 c1 = _mm_load_ps((float*)(source1 + 16 * x));
-                                                       
+
                                                        c0 = _mm_add_ps(c0, c1);
-                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 2.0f)); 
+                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 2.0f));
 
                                                        _mm_store_ps((float*)(source0 + 16 * x), c0);
                                                }
@@ -5192,11 +5175,11 @@ namespace sw
                                                        __m128 c1 = _mm_load_ps((float*)(source1 + 16 * x));
                                                        __m128 c2 = _mm_load_ps((float*)(source2 + 16 * x));
                                                        __m128 c3 = _mm_load_ps((float*)(source3 + 16 * x));
-                                                       
+
                                                        c0 = _mm_add_ps(c0, c1);
                                                        c2 = _mm_add_ps(c2, c3);
                                                        c0 = _mm_add_ps(c0, c2);
-                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 4.0f)); 
+                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 4.0f));
 
                                                        _mm_store_ps((float*)(source0 + 16 * x), c0);
                                                }
@@ -5221,7 +5204,7 @@ namespace sw
                                                        __m128 c5 = _mm_load_ps((float*)(source5 + 16 * x));
                                                        __m128 c6 = _mm_load_ps((float*)(source6 + 16 * x));
                                                        __m128 c7 = _mm_load_ps((float*)(source7 + 16 * x));
-                                                       
+
                                                        c0 = _mm_add_ps(c0, c1);
                                                        c2 = _mm_add_ps(c2, c3);
                                                        c4 = _mm_add_ps(c4, c5);
@@ -5229,7 +5212,7 @@ namespace sw
                                                        c0 = _mm_add_ps(c0, c2);
                                                        c4 = _mm_add_ps(c4, c6);
                                                        c0 = _mm_add_ps(c0, c4);
-                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 8.0f)); 
+                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 8.0f));
 
                                                        _mm_store_ps((float*)(source0 + 16 * x), c0);
                                                }
@@ -5282,7 +5265,7 @@ namespace sw
                                                        c0 = _mm_add_ps(c0, c4);
                                                        c8 = _mm_add_ps(c8, cC);
                                                        c0 = _mm_add_ps(c0, c8);
-                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 16.0f)); 
+                                                       c0 = _mm_mul_ps(c0, _mm_set1_ps(1.0f / 16.0f));
 
                                                        _mm_store_ps((float*)(source0 + 16 * x), c0);
                                                }
@@ -5466,7 +5449,7 @@ namespace sw
                                                {
                                                        __m128i c0 = _mm_load_si128((__m128i*)(source0 + 2 * x));
                                                        __m128i c1 = _mm_load_si128((__m128i*)(source1 + 2 * x));
-                                               
+
                                                        static const ushort8 r_b = {0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F};
                                                        static const ushort8 _g_ = {0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0};
                                                        __m128i c0_r_b = _mm_and_si128(c0, reinterpret_cast<const __m128i&>(r_b));
@@ -5497,7 +5480,7 @@ namespace sw
                                                        __m128i c1 = _mm_load_si128((__m128i*)(source1 + 2 * x));
                                                        __m128i c2 = _mm_load_si128((__m128i*)(source2 + 2 * x));
                                                        __m128i c3 = _mm_load_si128((__m128i*)(source3 + 2 * x));
-                                                       
+
                                                        static const ushort8 r_b = {0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F};
                                                        static const ushort8 _g_ = {0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0};
                                                        __m128i c0_r_b = _mm_and_si128(c0, reinterpret_cast<const __m128i&>(r_b));
@@ -5542,7 +5525,7 @@ namespace sw
                                                        __m128i c5 = _mm_load_si128((__m128i*)(source5 + 2 * x));
                                                        __m128i c6 = _mm_load_si128((__m128i*)(source6 + 2 * x));
                                                        __m128i c7 = _mm_load_si128((__m128i*)(source7 + 2 * x));
-                                                       
+
                                                        static const ushort8 r_b = {0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F};
                                                        static const ushort8 _g_ = {0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x07E0};
                                                        __m128i c0_r_b = _mm_and_si128(c0, reinterpret_cast<const __m128i&>(r_b));
index 1d81c35..2d9154d 100644 (file)
@@ -27,6 +27,9 @@ namespace sw
 \r
                void clip(int minX, int minY, int maxX, int maxY);\r
 \r
+               int width() const  { return x1 - x0; }\r
+               int height() const { return y1 - y0; }\r
+\r
                int x0;   // Inclusive\r
                int y0;   // Inclusive\r
                int x1;   // Exclusive\r
@@ -154,7 +157,7 @@ namespace sw
                FORMAT_R32F,\r
                FORMAT_G32R32F,\r
                FORMAT_B32G32R32F,\r
-               FORMAT_A32B32G32R32F, \r
+               FORMAT_A32B32G32R32F,\r
                // Bump map formats\r
                FORMAT_V8U8,\r
                FORMAT_L6V5U5,\r
@@ -283,9 +286,9 @@ namespace sw
                inline int getSuperSampleCount() const;\r
 \r
                bool isEntire(const SliceRect& rect) const;\r
-               bool getClearRect(int x0, int y0, int width, int height, SliceRect& rect) const;\r
-               void clearDepthBuffer(float depth, int x0, int y0, int width, int height);\r
-               void clearStencilBuffer(unsigned char stencil, unsigned char mask, int x0, int y0, int width, int height);\r
+               SliceRect getRect() const;\r
+               void clearDepth(float depth, int x0, int y0, int width, int height);\r
+               void clearStencil(unsigned char stencil, unsigned char mask, int x0, int y0, int width, int height);\r
                void fill(const Color<float> &color, int x0, int y0, int width, int height);\r
 \r
                Color<float> readExternal(int x, int y, int z) const;\r
@@ -294,7 +297,7 @@ namespace sw
                Color<float> sampleExternal(float x, float y) const;\r
                void writeExternal(int x, int y, int z, const Color<float> &color);\r
                void writeExternal(int x, int y, const Color<float> &color);\r
-               \r
+\r
                void copyInternal(const Surface* src, int x, int y, float srcX, float srcY, bool filter);\r
                void copyInternal(const Surface* src, int x, int y, int z, float srcX, float srcY, float srcZ, bool filter);\r
 \r