dm 7 anni fa
parent
commit
936d350568

+ 9 - 2
oxygine/src/oxygine/PostProcess.cpp

@@ -96,6 +96,8 @@ namespace oxygine
         shaderBlit = new ShaderProgramGL(ShaderProgramGL::createProgram(vs, fs, decl, true));
         driver->setShaderProgram(shaderBlit);
         driver->setUniformInt("s_texture", 0);
+
+        rsCache().resetShader();
     }
 
     void PostProcess::freeShaders()
@@ -320,6 +322,8 @@ namespace oxygine
     {
         if (!postProcessItems.empty())
         {
+            rsCache().checkTextures();
+
             _renderingPP = true;
 
             IVideoDriver* driver = IVideoDriver::instance;
@@ -329,6 +333,8 @@ namespace oxygine
 
             ShaderProgram* sp = driver->getShaderProgram();
 
+            if (postProcessItems.size() == 2)
+                int q = 0;
             for (size_t i = 0; i < postProcessItems.size(); ++i)
             {
                 PPTask* p = postProcessItems[i];
@@ -341,6 +347,7 @@ namespace oxygine
             if (sp)
                 driver->setShaderProgram(sp);
             _renderingPP = false;
+            rsCache().reset();
         }
 
         _rtm.update();
@@ -363,7 +370,7 @@ namespace oxygine
 
         driver->setViewport(destRect);
 
-        driver->setTexture(0, srcTexture);
+        rsCache().setTexture(0, srcTexture);
 
 
         vertexPCT2 v[4];
@@ -377,7 +384,7 @@ namespace oxygine
 
 
         driver->draw(IVideoDriver::PT_TRIANGLE_STRIP, decl, v, sizeof(v));
-        driver->setTexture(0, 0);
+        rsCache().setTexture(0, 0);
     }
 
     PostProcess::PostProcess(const PostProcessOptions& opt) : _options(opt), _format(TF_R4G4B4A4), _extend(2, 2)

+ 34 - 11
oxygine/src/oxygine/STDRenderer.cpp

@@ -50,11 +50,10 @@ namespace oxygine
     void RenderStateCache::reset()
     {
         resetTextures();
-
+        resetShader();
         _blend = blend_disabled;
         if (_driver)
             _driver->setState(IVideoDriver::STATE_BLEND, 0);
-        _program = 0;
     }
 
     void RenderStateCache::resetTextures()
@@ -63,20 +62,33 @@ namespace oxygine
             _textures[i] = 0;
     }
 
-    void RenderStateCache::setTexture(int sampler, const spNativeTexture& t)
+    void RenderStateCache::resetShader()
     {
-        OX_ASSERT(sampler < MAX_TEXTURES);
+        _program = 0;
+    }
 
+    void RenderStateCache::checkTextures()
+    {
 #ifdef OX_DEBUG
-        if (_textures[sampler] && _driver == IVideoDriver::instance)
+        for (int i = 0; i < MAX_TEXTURES; ++i)
         {
-            GLint whichID;
-            oxglActiveTexture(GL_TEXTURE0 + sampler);
-            glGetIntegerv(GL_TEXTURE_BINDING_2D, &whichID);
+            if (_textures[i] && _driver == IVideoDriver::instance)
+            {
+                GLint whichID;
+                oxglActiveTexture(GL_TEXTURE0 + i);
+                glGetIntegerv(GL_TEXTURE_BINDING_2D, &whichID);
 
-            OX_ASSERT(_textures[sampler]->getHandle() == (nativeTextureHandle)(size_t)whichID);
+                OX_ASSERT(_textures[i]->getHandle() == (nativeTextureHandle)(size_t)whichID);
+            }
         }
 #endif
+    }
+
+    void RenderStateCache::setTexture(int sampler, const spNativeTexture& t)
+    {
+        OX_ASSERT(sampler < MAX_TEXTURES);
+
+        checkTextures();
 
         if (_textures[sampler] == t)
             return;
@@ -112,11 +124,22 @@ namespace oxygine
 
     bool RenderStateCache::setShader(ShaderProgram* prog)
     {
+#ifdef OX_DEBUG
+        if (_program && _driver == IVideoDriver::instance)
+        {
+            GLint whichID;
+            glGetIntegerv(GL_CURRENT_PROGRAM, &whichID);
+
+            OX_ASSERT((size_t)_program->getID() == (size_t)whichID);
+        }
+#endif
+
         if (_program == prog)
             return false;
 
         _program = prog;
-        _driver->setShaderProgram(prog);
+        if (prog)
+            _driver->setShaderProgram(prog);
         return true;
     }
 
@@ -289,7 +312,7 @@ namespace oxygine
 
     void STDRenderer::setShader(ShaderProgram* prog)
     {
-        if (rsCache().setShader(prog))
+        if (rsCache().setShader(prog)) {}
         {
             //_driver->setUniform("mat", _vp);
             shaderProgramChanged();

+ 4 - 1
oxygine/src/oxygine/STDRenderer.h

@@ -21,11 +21,14 @@ namespace oxygine
 
         void reset();
         void resetTextures();
+        void resetShader();
+
+        void checkTextures();
 
         void changeDriver(IVideoDriver* d);//used for DebugActor
 
     protected:
-        enum { MAX_TEXTURES = 8 };
+        enum { MAX_TEXTURES = 5 };
 
         spNativeTexture _textures[MAX_TEXTURES];
         ShaderProgram*  _program;

+ 2 - 0
oxygine/src/oxygine/core/UberShaderProgram.cpp

@@ -3,6 +3,7 @@
 #include "vertex.h"
 #include "gl/ShaderProgramGL.h"
 #include "gl/VideoDriverGLES20.h"
+#include "STDRenderer.h"
 
 namespace oxygine
 {
@@ -99,6 +100,7 @@ namespace oxygine
 
             s.program = pgl;
 
+            rsCache().resetShader();
 
             CHECKGL();
         }