OSDN Git Service

Make Blitter part of Renderer.
[android-x86/external-swiftshader.git] / src / Renderer / Renderer.cpp
index 7e7ec40..a84423d 100644 (file)
@@ -114,6 +114,7 @@ namespace sw
 
                setRenderTarget(0, 0);
                clipper = new Clipper(symmetricNormalizedDepth);
+               blitter = new Blitter;
 
                updateViewMatrix = true;
                updateBaseMatrix = true;
@@ -177,7 +178,10 @@ namespace sw
                sync->destruct();
 
                delete clipper;
-               clipper = 0;
+               clipper = nullptr;
+
+               delete blitter;
+               blitter = nullptr;
 
                terminateThreads();
                delete resumeApp;
@@ -190,19 +194,16 @@ namespace sw
                delete swiftConfig;
        }
 
-       void Renderer::clear(void *pixel, Format format, Surface *dest, const SliceRect &dRect, unsigned int rgbaMask)
-       {
-               blitter.clear(pixel, format, dest, dRect, rgbaMask);
-       }
-
-       void Renderer::blit(Surface *source, const SliceRect &sRect, Surface *dest, const SliceRect &dRect, bool filter)
+       // This object has to be mem aligned
+       void* Renderer::operator new(size_t size)
        {
-               blitter.blit(source, sRect, dest, dRect, filter);
+               ASSERT(size == sizeof(Renderer)); // This operator can't be called from a derived class
+               return sw::allocate(sizeof(Renderer), 16);
        }
 
-       void Renderer::blit3D(Surface *source, Surface *dest)
+       void Renderer::operator delete(void * mem)
        {
-               blitter.blit3D(source, dest);
+               sw::deallocate(mem);
        }
 
        void Renderer::draw(DrawType drawType, unsigned int indexOffset, unsigned int count, bool update)
@@ -234,10 +235,6 @@ namespace sw
 
                        sync->lock(sw::PRIVATE);
 
-                       Routine *vertexRoutine;
-                       Routine *setupRoutine;
-                       Routine *pixelRoutine;
-
                        if(update || oldMultiSampleMask != context->multiSampleMask)
                        {
                                vertexState = VertexProcessor::update(drawType);
@@ -268,7 +265,9 @@ namespace sw
                                        setupPrimitives = &Renderer::setupVertexTriangle;
                                        batch = 1;
                                        break;
-                               default: ASSERT(false);
+                               default:
+                                       ASSERT(false);
+                                       return;
                                }
                        }
                        else if(context->isDrawLine())
@@ -447,7 +446,7 @@ namespace sw
                                        draw->vsDirtyConstB = 0;
                                }
 
-                               if(context->vertexShader->instanceIdDeclared)
+                               if(context->vertexShader->isInstanceIdDeclared())
                                {
                                        data->instanceID = context->instanceID;
                                }
@@ -624,7 +623,7 @@ namespace sw
 
                                if(draw->stencilBuffer)
                                {
-                                       data->stencilBuffer = (unsigned char*)context->stencilBuffer->lockStencil(q * ms, MANAGED);
+                                       data->stencilBuffer = (unsigned char*)context->stencilBuffer->lockStencil(0, 0, q * ms, MANAGED);
                                        data->stencilPitchB = context->stencilBuffer->getStencilPitchB();
                                        data->stencilSliceB = context->stencilBuffer->getStencilSliceB();
                                }
@@ -647,7 +646,16 @@ namespace sw
                        nextDraw++;
                        schedulerMutex.unlock();
 
-                       if(threadCount > 1)
+                       #ifndef NDEBUG
+                       if(threadCount == 1)   // Use main thread for draw execution
+                       {
+                               threadsAwake = 1;
+                               task[0].type = Task::RESUME;
+
+                               taskLoop(0);
+                       }
+                       else
+                       #endif
                        {
                                if(!threadsAwake)
                                {
@@ -659,16 +667,24 @@ namespace sw
                                        resume[0]->signal();
                                }
                        }
-                       else   // Use main thread for draw execution
-                       {
-                               threadsAwake = 1;
-                               task[0].type = Task::RESUME;
-
-                               taskLoop(0);
-                       }
                }
        }
 
+       void Renderer::clear(void *pixel, Format format, Surface *dest, const SliceRect &dRect, unsigned int rgbaMask)
+       {
+               blitter->clear(pixel, format, dest, dRect, rgbaMask);
+       }
+
+       void Renderer::blit(Surface *source, const SliceRect &sRect, Surface *dest, const SliceRect &dRect, bool filter, bool isStencil)
+       {
+               blitter->blit(source, sRect, dest, dRect, filter, isStencil);
+       }
+
+       void Renderer::blit3D(Surface *source, Surface *dest)
+       {
+               blitter->blit3D(source, dest);
+       }
+
        void Renderer::threadFunction(void *parameters)
        {
                Renderer *renderer = static_cast<Parameters*>(parameters)->renderer;