فهرست منبع

Fixed threaded renderer memory access crash

Ivan Safrin 9 سال پیش
والد
کامیت
9be3ea5d3e

+ 3 - 3
build/osx/TemplateApp/TemplateApp/PolycodeTemplateApp.mm

@@ -48,9 +48,9 @@ PolycodeTemplateApp::PolycodeTemplateApp(PolycodeView *view) {
     camera->getShaderPass(3).shaderBinding->addParam(ProgramParam::PARAM_NUMBER, "exposure")->setNumber(0.7);
  */
 
-    scene->getDefaultCamera()->setPostFilterByName("Blur");
-    camera->getShaderPass(0).shaderBinding->addParam(ProgramParam::PARAM_NUMBER, "blurSize")->setNumber(0.003);
-    camera->getShaderPass(1).shaderBinding->addParam(ProgramParam::PARAM_NUMBER, "blurSize")->setNumber(0.003);
+    //scene->getDefaultCamera()->setPostFilterByName("Blur");
+    //camera->getShaderPass(0).shaderBinding->addParam(ProgramParam::PARAM_NUMBER, "blurSize")->setNumber(0.003);
+    //camera->getShaderPass(1).shaderBinding->addParam(ProgramParam::PARAM_NUMBER, "blurSize")->setNumber(0.003);
 
 //    Sound *music = new Sound("BUGSHUFFLE.ogg");
   //  music->Play();

+ 0 - 2
include/polycode/core/PolyRenderer.h

@@ -164,7 +164,6 @@ namespace Polycode {
             static const int JOB_CREATE_RENDER_BUFFER = 12;
             static const int JOB_DESTROY_RENDER_BUFFER = 13;
             static const int JOB_SET_TEXTURE_PARAM = 14;
-            static const int JOB_ADD_PARAM_TO_BINDING = 15;
             static const int JOB_DESTROY_SHADER_BINDING = 16;
             static const int JOB_DESTROY_SHADER_PARAM = 17;
         
@@ -229,7 +228,6 @@ namespace Polycode {
         void destroyShaderParam(LocalShaderParam *param);
         
         void setTextureParam(LocalShaderParam *param, Texture *texture);
-        void addParamToShaderBinding(LocalShaderParam *param, ShaderBinding *binding);
         
         void setAnisotropyAmount(Number amount);
         Number getAnisotropyAmount();

+ 3 - 0
include/polycode/core/PolyShader.h

@@ -38,6 +38,7 @@ namespace Polycode {
     class VertexDataArray;
     class LocalShaderParam;
     class RenderBuffer;
+    class CoreMutex;
     
 	class _PolyExport ProgramParam {
 		public:
@@ -254,6 +255,8 @@ namespace Polycode {
         
             bool resetAttributes;
             Shader *targetShader;
+        
+            CoreMutex *accessMutex;
 	};
 
 }

+ 15 - 13
src/core/PolyRenderer.cpp

@@ -120,6 +120,7 @@ void RenderThread::processDrawBuffer(GPUDrawBuffer *buffer) {
     projectionMatrixParam->setMatrix4(buffer->projectionMatrix);
     viewMatrixParam->setMatrix4(buffer->viewMatrix);
 
+    
     int lightShadowIndex = 0;
     
     for(int i=0; i <RENDERER_MAX_LIGHTS; i++) {
@@ -143,7 +144,8 @@ void RenderThread::processDrawBuffer(GPUDrawBuffer *buffer) {
             
             if(buffer->lights[i].shadowsEnabled) {
                 lightShadows[lightShadowIndex].shadowMatrix->setMatrix4(buffer->lights[i].lightViewMatrix);
-                lightShadows[lightShadowIndex].shadowBuffer->setTexture(buffer->lights[i].shadowMapTexture);
+                lightShadows[lightShadowIndex].shadowBuffer->data = (void*) buffer->lights[i].shadowMapTexture;
+                
                 lights[i].shadowEnabled->setNumber(1.0);
                 
                 if(lightShadowIndex < RENDERER_MAX_LIGHT_SHADOWS-1) {
@@ -214,6 +216,7 @@ void RenderThread::processDrawBuffer(GPUDrawBuffer *buffer) {
                 ShaderBinding *localShaderBinding = buffer->drawCalls[i].shaderPasses[s].shaderBinding;
                 ShaderBinding *materialShaderBinding = shaderPass.materialShaderBinding;
                 
+                
                 if(buffer->globalMaterial) {
                     if(s < buffer->globalMaterial->getNumShaderPasses()) {
                         shaderPass = buffer->globalMaterial->getShaderPass(s);
@@ -221,6 +224,7 @@ void RenderThread::processDrawBuffer(GPUDrawBuffer *buffer) {
                     }
                 }
                 
+
                 if(!shaderPass.shader || !localShaderBinding) {
                     continue;
                 }
@@ -234,7 +238,11 @@ void RenderThread::processDrawBuffer(GPUDrawBuffer *buffer) {
                         graphicsInterface->setParamInShader(shaderPass.shader, &shaderPass.shader->expectedParams[p], shaderPass.shader->expectedParams[p].globalParam);
                     }
                 }
-                 
+                
+                
+                if(materialShaderBinding && materialShaderBinding != localShaderBinding) {
+                    materialShaderBinding->accessMutex->lock();
+                }
                 if(materialShaderBinding) {
                     for(int p=0; p < materialShaderBinding->getNumLocalParams(); p++) {                        
                         LocalShaderParam *localParam = materialShaderBinding->getLocalParam(p);
@@ -248,6 +256,9 @@ void RenderThread::processDrawBuffer(GPUDrawBuffer *buffer) {
                         }
                     }
                 }
+                if(materialShaderBinding  && materialShaderBinding != localShaderBinding) {
+                    materialShaderBinding->accessMutex->unlock();
+                }
                 
                 bool rebindAttributes = false;
                 
@@ -256,6 +267,7 @@ void RenderThread::processDrawBuffer(GPUDrawBuffer *buffer) {
                     rebindAttributes = true;
                 }
                 
+                localShaderBinding->accessMutex->lock();
                 for(int p=0; p < localShaderBinding->getNumLocalParams(); p++) {
                     LocalShaderParam *localParam = localShaderBinding->getLocalParam(p);
                     if(localParam) {
@@ -267,6 +279,7 @@ void RenderThread::processDrawBuffer(GPUDrawBuffer *buffer) {
                         }
                     }
                 }
+                localShaderBinding->accessMutex->unlock();
 
                 if(rebindAttributes || localShaderBinding->resetAttributes ) {
                     buffer->drawCalls[i].shaderPasses[s].setExpectedAttributes();
@@ -416,13 +429,6 @@ void RenderThread::processJob(const RendererThreadJob &job) {
             param->data = (void*) texture;
         }
         break;
-        case JOB_ADD_PARAM_TO_BINDING:
-        {
-            LocalShaderParam *param = (LocalShaderParam*) job.data;
-            ShaderBinding *binding = (ShaderBinding*) job.data2;
-            binding->localParams.push_back(param);
-        }
-        break;
         case JOB_CREATE_SHADER:
         {
             Shader *shader = (Shader*) job.data;
@@ -618,10 +624,6 @@ void Renderer::setTextureParam(LocalShaderParam *param, Texture *texture) {
     renderThread->enqueueJob(RenderThread::JOB_SET_TEXTURE_PARAM, (void*)param, (void*)texture);
 }
 
-void Renderer::addParamToShaderBinding(LocalShaderParam *param, ShaderBinding *binding) {
-    renderThread->enqueueJob(RenderThread::JOB_ADD_PARAM_TO_BINDING, (void*)param, (void*)binding);
-}
-
 void Renderer::destroyShaderBinding(ShaderBinding *binding) {
     renderThread->enqueueJob(RenderThread::JOB_DESTROY_SHADER_BINDING, (void*)binding);
 }

+ 19 - 3
src/core/PolyShader.cpp

@@ -24,6 +24,7 @@
 #include "polycode/core/PolyMatrix4.h"
 #include "polycode/core/PolyCoreServices.h"
 #include "polycode/core/PolyRenderer.h"
+#include "polycode/core/PolyCore.h"
 
 using namespace Polycode;
 
@@ -105,15 +106,19 @@ void ShaderProgram::reloadResource() {
 
 
 ShaderBinding::ShaderBinding() : targetShader(NULL) {
+    accessMutex = Services()->getCore()->createMutex();
 }
 
 ShaderBinding::~ShaderBinding() {
+    accessMutex->lock();
 	for(int i=0; i < localParams.size(); i++) {
         delete localParams[i]; //Services()->getRenderer()->destroyShaderParam(localParams[i]);
 	}	
 	for(int i=0; i < renderTargetBindings.size(); i++) {
 		delete renderTargetBindings[i];
-	}	
+	}
+    accessMutex->unlock();
+    delete accessMutex;
 }
 
 unsigned int ShaderBinding::getNumLocalParams() {
@@ -162,7 +167,11 @@ LocalShaderParam *ShaderBinding::addParam(int type, const String& name) {
     if(type == ProgramParam::PARAM_TEXTURE || type == ProgramParam::PARAM_CUBEMAP) {
         newParam->ownsPointer = false;
     }
-    Services()->getRenderer()->addParamToShaderBinding(newParam, this);
+    
+    accessMutex->lock();
+    localParams.push_back(newParam);
+    accessMutex->unlock();
+    
 	return newParam;
 }
 
@@ -173,7 +182,9 @@ LocalShaderParam *ShaderBinding::addParamPointer(int type, const String& name, v
     newParam->type = type;
     newParam->param = NULL;
     newParam->ownsPointer = false;
-    Services()->getRenderer()->addParamToShaderBinding(newParam, this);
+    accessMutex->lock();
+    localParams.push_back(newParam);
+    accessMutex->unlock();
     return newParam;
 }
 
@@ -231,10 +242,12 @@ void ShaderBinding::removeRenderTargetBinding(RenderTargetBinding *binding) {
 }
 
 void ShaderBinding::copyTo(ShaderBinding *targetBinding) {
+    targetBinding->accessMutex->lock();
     for(int i=0; i < localParams.size(); i++) {
         LocalShaderParam *copyParam = localParams[i]->Copy();
         targetBinding->localParams.push_back(copyParam);
     }
+   targetBinding->accessMutex->unlock();
 }
 
 unsigned int ShaderBinding::getNumRenderTargetBindings() {
@@ -307,7 +320,10 @@ void ShaderBinding::removeParam(const String &name) {
     for(int i=0; i < localParams.size(); i++) {
         if(localParams[i]->name == name) {
             Services()->getRenderer()->destroyShaderParam(localParams[i]);
+            accessMutex->lock();
             localParams.erase(localParams.begin()+i);
+            accessMutex->unlock();
+            return;
         }
     }
 }