Sfoglia il codice sorgente

Fixed rendering memory leak

Ivan Safrin 9 anni fa
parent
commit
e6fecb1054

+ 2 - 2
bindings/javascript/Polycode/Ray.js

@@ -42,8 +42,8 @@ Duktape.fin(Ray.prototype, function (x) {
 	Polycode.Ray__delete(x.__ptr)
 })
 
-Ray.prototype.boxIntersect = function(box,transformMatrix,near,far) {
-	return Polycode.Ray_boxIntersect(this.__ptr, box,transformMatrix,near,far)
+Ray.prototype.boxIntersect = function(box,transformMatrix,vnear,vfar) {
+	return Polycode.Ray_boxIntersect(this.__ptr, box,transformMatrix,vnear,vfar)
 }
 
 Ray.prototype.planeIntersectPoint = function(planeNormal,planeDistance) {

+ 0 - 9
bindings/javascript/Polycode/ShaderBinding.js

@@ -1,18 +1,9 @@
 function ShaderBinding() {
 	Object.defineProperties(this, {
-		'resetAttributes': { enumerable: true, configurable: true, get: ShaderBinding.prototype.__get_resetAttributes, set: ShaderBinding.prototype.__set_resetAttributes},
 		'targetShader': { enumerable: true, configurable: true, get: ShaderBinding.prototype.__get_targetShader, set: ShaderBinding.prototype.__set_targetShader},
 		'accessMutex': { enumerable: true, configurable: true, get: ShaderBinding.prototype.__get_accessMutex, set: ShaderBinding.prototype.__set_accessMutex}
 	})
 }
-ShaderBinding.prototype.__get_resetAttributes = function() {
-	return Polycode.ShaderBinding__get_resetAttributes(this.__ptr)
-}
-
-ShaderBinding.prototype.__set_resetAttributes = function(val) {
-	Polycode.ShaderBinding__set_resetAttributes(this.__ptr, val)
-}
-
 ShaderBinding.prototype.__get_targetShader = function() {
 	var retVal = new Shader()
 	retVal.__ptr = 	Polycode.ShaderBinding__get_targetShader(this.__ptr)

BIN
bindings/javascript/js_Polycode.pak


+ 2 - 2
bindings/lua/Polycode/Ray.lua

@@ -50,8 +50,8 @@ function Ray:Ray(...)
 	end
 end
 
-function Ray:boxIntersect(box, transformMatrix, near, far)
-	local retVal = Polycode.Ray_boxIntersect(self.__ptr, box.__ptr, transformMatrix.__ptr, near, far)
+function Ray:boxIntersect(box, transformMatrix, vnear, vfar)
+	local retVal = Polycode.Ray_boxIntersect(self.__ptr, box.__ptr, transformMatrix.__ptr, vnear, vfar)
 	return retVal
 end
 

+ 2 - 7
bindings/lua/Polycode/ShaderBinding.lua

@@ -2,9 +2,7 @@ class "ShaderBinding"
 
 
 function ShaderBinding:__getvar(name)
-	if name == "resetAttributes" then
-		return Polycode.ShaderBinding_get_resetAttributes(self.__ptr)
-	elseif name == "targetShader" then
+	if name == "targetShader" then
 		local retVal = Polycode.ShaderBinding_get_targetShader(self.__ptr)
 		if retVal == nil then return nil end
 		local __c = _G["Shader"]("__skip_ptr__")
@@ -20,10 +18,7 @@ function ShaderBinding:__getvar(name)
 end
 
 function ShaderBinding:__setvar(name,value)
-	if name == "resetAttributes" then
-		Polycode.ShaderBinding_set_resetAttributes(self.__ptr, value)
-		return true
-	elseif name == "targetShader" then
+	if name == "targetShader" then
 		Polycode.ShaderBinding_set_targetShader(self.__ptr, value.__ptr)
 		return true
 	elseif name == "accessMutex" then

BIN
bindings/lua/lua_Polycode.pak


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

@@ -71,7 +71,7 @@ bool PolycodeTemplateApp::Update() {
     for(int i=0; i < tests.size(); i++) {
         tests[i]->Roll(elapsed * 30.0);
     }
-    
+	/*
     if(tests.size() > 0) {
         SceneMesh *removing = tests[0];
         tests.erase(tests.begin());
@@ -89,10 +89,8 @@ bool PolycodeTemplateApp::Update() {
         test->setScale(0.1, 0.1);
         scene->addChild(test);
         tests.push_back(test);
-        
-        
     }
-    
+    */
     ++numFrames;
     counter += elapsed;
     if(counter >= 1.0) {
@@ -100,6 +98,6 @@ bool PolycodeTemplateApp::Update() {
         fpsLabel->setText("FPS:"+String::IntToString(numFrames)+" FRAME MS:"+String::IntToString(Services()->getRenderer()->getRenderThread()->getFrameInfo().timeTaken));
         numFrames = 0;
     }
-    
+	 
     return core->updateAndRender();
 }

+ 9 - 21
include/polycode/bindings/javascript/PolycodeJSWrappers.h

@@ -813,7 +813,7 @@ namespace Polycode {
 
 	duk_ret_t Polycode_Camera_setViewport(duk_context *context) {
 		Camera *inst = (Camera*)duk_to_pointer(context, 0);
-		Polycode::Rectangle viewport = *(Polycode::Rectangle*)duk_to_pointer(context, 1);
+		Rectangle viewport = *(Rectangle*)duk_to_pointer(context, 1);
 		inst->setViewport(viewport);
 		return 0;
 	}
@@ -847,7 +847,7 @@ namespace Polycode {
 	duk_ret_t Polycode_Camera_projectRayFrom2DCoordinate(duk_context *context) {
 		Camera *inst = (Camera*)duk_to_pointer(context, 0);
 		Vector2 coordinate = *(Vector2*)duk_to_pointer(context, 1);
-		Polycode::Rectangle viewport = *(Polycode::Rectangle*)duk_to_pointer(context, 2);
+		Rectangle viewport = *(Rectangle*)duk_to_pointer(context, 2);
 		Vector3 *retInst = new Vector3();
 		*retInst = inst->projectRayFrom2DCoordinate(coordinate,viewport);
 		duk_push_pointer(context, (void*)retInst);
@@ -2546,7 +2546,7 @@ namespace Polycode {
 
 	duk_ret_t Polycode_CoreServices_Render(duk_context *context) {
 		CoreServices *inst = (CoreServices*)duk_to_pointer(context, 0);
-		Polycode::Rectangle viewport = *(Polycode::Rectangle*)duk_to_pointer(context, 1);
+		Rectangle viewport = *(Rectangle*)duk_to_pointer(context, 1);
 		inst->Render(viewport);
 		return 0;
 	}
@@ -3100,7 +3100,7 @@ namespace Polycode {
 	duk_ret_t Polycode_Entity_transformAndRender(duk_context *context) {
 		Entity *inst = (Entity*)duk_to_pointer(context, 0);
 		GPUDrawBuffer* drawBuffer = (GPUDrawBuffer*)duk_to_pointer(context, 1);
-		Polycode::Rectangle* parentScissorBox = (Polycode::Rectangle*)duk_to_pointer(context, 2);
+		Rectangle* parentScissorBox = (Rectangle*)duk_to_pointer(context, 2);
 		inst->transformAndRender(drawBuffer,parentScissorBox);
 		return 0;
 	}
@@ -3108,7 +3108,7 @@ namespace Polycode {
 	duk_ret_t Polycode_Entity_renderChildren(duk_context *context) {
 		Entity *inst = (Entity*)duk_to_pointer(context, 0);
 		GPUDrawBuffer* buffer = (GPUDrawBuffer*)duk_to_pointer(context, 1);
-		Polycode::Rectangle* parentScissorBox = (Polycode::Rectangle*)duk_to_pointer(context, 2);
+		Rectangle* parentScissorBox = (Rectangle*)duk_to_pointer(context, 2);
 		inst->renderChildren(buffer,parentScissorBox);
 		return 0;
 	}
@@ -3846,7 +3846,7 @@ namespace Polycode {
 		Entity *inst = (Entity*)duk_to_pointer(context, 0);
 		Matrix4 projectionMatrix = *(Matrix4*)duk_to_pointer(context, 1);
 		Matrix4 cameraMatrix = *(Matrix4*)duk_to_pointer(context, 2);
-		Polycode::Rectangle viewport = *(Polycode::Rectangle*)duk_to_pointer(context, 3);
+		Rectangle viewport = *(Rectangle*)duk_to_pointer(context, 3);
 		Vector2 *retInst = new Vector2();
 		*retInst = inst->getScreenPosition(projectionMatrix,cameraMatrix,viewport);
 		duk_push_pointer(context, (void*)retInst);
@@ -4845,7 +4845,7 @@ namespace Polycode {
 
 	duk_ret_t Polycode_Image_getImagePart(duk_context *context) {
 		Image *inst = (Image*)duk_to_pointer(context, 0);
-		Polycode::Rectangle subRect = *(Polycode::Rectangle*)duk_to_pointer(context, 1);
+		Rectangle subRect = *(Rectangle*)duk_to_pointer(context, 1);
 		PolyBase *ptrRetVal = (PolyBase*)inst->getImagePart(subRect);
 		duk_push_pointer(context, (void*)ptrRetVal);
 		return 1;
@@ -7880,7 +7880,7 @@ namespace Polycode {
 
 	duk_ret_t Polycode_Rectangle_Clipped(duk_context *context) {
 		Rectangle *inst = (Rectangle*)duk_to_pointer(context, 0);
-		Polycode::Rectangle rect = *(Polycode::Rectangle*)duk_to_pointer(context, 1);
+		Rectangle rect = *(Rectangle*)duk_to_pointer(context, 1);
 		Polycode::Rectangle *retInst = new Polycode::Rectangle();
 		*retInst = inst->Clipped(rect);
 		duk_push_pointer(context, (void*)retInst);
@@ -10005,7 +10005,7 @@ namespace Polycode {
 
 	duk_ret_t Polycode_SceneManager_Render(duk_context *context) {
 		SceneManager *inst = (SceneManager*)duk_to_pointer(context, 0);
-		Polycode::Rectangle viewport = *(Polycode::Rectangle*)duk_to_pointer(context, 1);
+		Rectangle viewport = *(Rectangle*)duk_to_pointer(context, 1);
 		inst->Render(viewport);
 		return 0;
 	}
@@ -11740,18 +11740,6 @@ namespace Polycode {
 		return 0;
 	}
 
-	duk_ret_t Polycode_ShaderBinding__get_resetAttributes(duk_context *context) {
-		ShaderBinding *inst = (ShaderBinding*)duk_to_pointer(context, 0);
-		duk_push_boolean(context, inst->resetAttributes);
-		return 1;
-	}
-
-	duk_ret_t Polycode_ShaderBinding__set_resetAttributes(duk_context *context) {
-		ShaderBinding *inst = (ShaderBinding*)duk_to_pointer(context, 0);
-		inst->resetAttributes = duk_to_boolean(context, 1);
-		return 0;
-	}
-
 	duk_ret_t Polycode_ShaderBinding__get_targetShader(duk_context *context) {
 		ShaderBinding *inst = (ShaderBinding*)duk_to_pointer(context, 0);
 		PolyBase *ptrRetVal = (PolyBase*)inst->targetShader;

+ 0 - 15
include/polycode/bindings/lua/PolycodeLuaWrappers.h

@@ -16543,13 +16543,6 @@ static int Polycode_AttributeBinding_set_enabled(lua_State *L) {
 		return 0;
 	}
 
-static int Polycode_ShaderBinding_get_resetAttributes(lua_State *L) {
-	luaL_checktype(L, 1, LUA_TUSERDATA);
-	ShaderBinding *inst = (ShaderBinding*) *((PolyBase**)lua_touserdata(L, 1));
-	lua_pushboolean(L, inst->resetAttributes);
-	return 1;
-}
-
 static int Polycode_ShaderBinding_get_targetShader(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TUSERDATA);
 	ShaderBinding *inst = (ShaderBinding*) *((PolyBase**)lua_touserdata(L, 1));
@@ -16574,14 +16567,6 @@ static int Polycode_ShaderBinding_get_accessMutex(lua_State *L) {
 	return 1;
 }
 
-static int Polycode_ShaderBinding_set_resetAttributes(lua_State *L) {
-	luaL_checktype(L, 1, LUA_TUSERDATA);
-	ShaderBinding *inst = (ShaderBinding*) *((PolyBase**)lua_touserdata(L, 1));
-	bool param = lua_toboolean(L, 2) != 0;
-	inst->resetAttributes = param;
-	return 0;
-}
-
 static int Polycode_ShaderBinding_set_targetShader(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TUSERDATA);
 	ShaderBinding *inst = (ShaderBinding*) *((PolyBase**)lua_touserdata(L, 1));

+ 3 - 1
include/polycode/core/PolyMaterial.h

@@ -38,7 +38,9 @@ namespace Polycode {
 	class _PolyExport ShaderPass {
 		public:
 			ShaderPass();
-			ShaderPass(Shader *shader);		   
+			ShaderPass(Shader *shader);
+			ShaderPass(const ShaderPass &other);
+			~ShaderPass();
 			Shader *shader;
 			bool wireframe;
 			unsigned short blendingMode;

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

@@ -122,6 +122,7 @@ namespace Polycode {
 	
 	class _PolyExport RenderFrame : public PolyBase {
 	public:
+		~RenderFrame();
 		std::queue<RendererThreadJob> jobQueue;
 	};
 	
@@ -172,6 +173,8 @@ namespace Polycode {
 			RenderThreadDebugInfo lastFrameDebugInfo;
 			RenderThreadDebugInfo currentDebugFrameInfo;
 		
+			std::vector<RenderFrame*> framesToDelete;
+		
 			Core *core;
 			CoreMutex *jobQueueMutex;
 			CoreMutex *renderMutex;

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

@@ -254,7 +254,6 @@ namespace Polycode {
 			std::vector<RenderTargetBinding*> colorTargetBindings;
 			std::vector<RenderTargetBinding*> depthTargetBindings;
 		
-			bool resetAttributes;
 			Shader *targetShader;
 		
 			CoreMutex *accessMutex;

+ 0 - 2
src/bindings/javascript/PolycodeJS.cpp

@@ -1693,8 +1693,6 @@ int jsopen_Polycode(duk_context *ctx) {
 			{"AttributeBinding__get_enabled", Polycode_AttributeBinding__get_enabled, 1},
 			{"AttributeBinding__set_enabled", Polycode_AttributeBinding__set_enabled, 2},
 			{"AttributeBinding__delete", Polycode_AttributeBinding__delete, 1},
-			{"ShaderBinding__get_resetAttributes", Polycode_ShaderBinding__get_resetAttributes, 1},
-			{"ShaderBinding__set_resetAttributes", Polycode_ShaderBinding__set_resetAttributes, 2},
 			{"ShaderBinding__get_targetShader", Polycode_ShaderBinding__get_targetShader, 1},
 			{"ShaderBinding__set_targetShader", Polycode_ShaderBinding__set_targetShader, 2},
 			{"ShaderBinding__get_accessMutex", Polycode_ShaderBinding__get_accessMutex, 1},

+ 0 - 2
src/bindings/lua/PolycodeLua.cpp

@@ -1795,10 +1795,8 @@ int luaopen_Polycode(lua_State *L) {
 		{"AttributeBinding_set_enabled", Polycode_AttributeBinding_set_enabled},
 		{"AttributeBinding", Polycode_AttributeBinding},
 		{"delete_AttributeBinding", Polycode_delete_AttributeBinding},
-		{"ShaderBinding_get_resetAttributes", Polycode_ShaderBinding_get_resetAttributes},
 		{"ShaderBinding_get_targetShader", Polycode_ShaderBinding_get_targetShader},
 		{"ShaderBinding_get_accessMutex", Polycode_ShaderBinding_get_accessMutex},
-		{"ShaderBinding_set_resetAttributes", Polycode_ShaderBinding_set_resetAttributes},
 		{"ShaderBinding_set_targetShader", Polycode_ShaderBinding_set_targetShader},
 		{"ShaderBinding_set_accessMutex", Polycode_ShaderBinding_set_accessMutex},
 		{"ShaderBinding", Polycode_ShaderBinding},

+ 0 - 1
src/core/PolyCamera.cpp

@@ -365,7 +365,6 @@ void Camera::setPostFilter(Material *material) {
 		shaderPass.materialShaderBinding = shaderPass.shaderBinding;
 		shaderPass.shaderBinding = new ShaderBinding();
 		shaderPass.shaderBinding->targetShader = shaderPass.shader;
-		shaderPass.shaderBinding->resetAttributes = true;
 		
 		for(int j=0; j < materialBinding->getNumColorTargetBindings(); j++) {
 			RenderTargetBinding *colorBinding = materialBinding->getColorTargetBinding(j);

+ 16 - 6
src/core/PolyMaterial.cpp

@@ -36,9 +36,8 @@ ShaderPass::ShaderPass() :
 	wireframe(false),
 	shaderBinding(NULL),
 	materialShaderBinding(NULL),
-	blendingMode(Renderer::BLEND_MODE_NONE)
-{
-	
+	blendingMode(Renderer::BLEND_MODE_NONE) {
+
 }
 
 ShaderPass::ShaderPass(Shader *shader) :
@@ -46,11 +45,22 @@ ShaderPass::ShaderPass(Shader *shader) :
 	wireframe(false),
 	shaderBinding(NULL),
 	materialShaderBinding(NULL),
-	blendingMode(Renderer::BLEND_MODE_NONE)
-{
-	
+	blendingMode(Renderer::BLEND_MODE_NONE) {
+
 }
 
+ShaderPass::ShaderPass(const ShaderPass &other) {
+	shader = other.shader;
+	wireframe = other.wireframe;
+	blendingMode = other.blendingMode;
+	shaderBinding = other.shaderBinding;
+	materialShaderBinding = other.materialShaderBinding;
+}
+
+ShaderPass::~ShaderPass() {
+}
+
+
 Material::Material(const String& name) : Resource(Resource::RESOURCE_MATERIAL) {
 	this->name = name;
 	fp16RenderTargets = false;

+ 40 - 22
src/core/PolyRenderer.cpp

@@ -29,6 +29,17 @@
 
 using namespace Polycode;
 
+RenderFrame::~RenderFrame() {
+	while(jobQueue.size() > 0) {
+		RendererThreadJob frameJob = jobQueue.front();
+		if(frameJob.jobType == RenderThread::JOB_PROCESS_DRAW_BUFFER)  {
+			GPUDrawBuffer *buffer = (GPUDrawBuffer*) frameJob.data;
+			delete buffer;
+		}
+		jobQueue.pop();
+	}
+}
+
 GraphicsInterface::GraphicsInterface() {
 }
 
@@ -68,31 +79,35 @@ void RenderThread::initGlobals() {
 }
 
 void RenderThread::updateRenderThread() {
-		jobQueueMutex->lock();
+	jobQueueMutex->lock();
 		
-		while(jobQueue.size() > 0) {
-			RendererThreadJob nextJob = jobQueue.front();
-			jobQueue.pop();
-			processJob(nextJob);
-		}
+	while(jobQueue.size() > 0) {
+		RendererThreadJob nextJob = jobQueue.front();
+		jobQueue.pop();
+		processJob(nextJob);
+	}
 		
-		RenderFrame *nextFrame = NULL;
-		if(frameQueue.size() > 0) {
-			nextFrame = frameQueue.front();
-			frameQueue.pop();
-		}
+	RenderFrame *nextFrame = NULL;
+	if(frameQueue.size() > 0) {
+		nextFrame = frameQueue.front();
+		frameQueue.pop();
+	}
 
-		jobQueueMutex->unlock();
+	jobQueueMutex->unlock();
 
-		if(nextFrame) {
-			while(nextFrame->jobQueue.size() > 0) {
-				RendererThreadJob frameJob = nextFrame->jobQueue.front();
-				nextFrame->jobQueue.pop();
-				processJob(frameJob);
-			}
-			delete nextFrame;
+	if(nextFrame) {
+		while(nextFrame->jobQueue.size() > 0) {
+			RendererThreadJob frameJob = nextFrame->jobQueue.front();
+			nextFrame->jobQueue.pop();
+			processJob(frameJob);
 		}
-
+		delete nextFrame;
+	}
+	
+	for(int i=0; i < framesToDelete.size(); i++) {
+		delete framesToDelete[i];
+	}
+	framesToDelete.clear();
 }
 
 void RenderThread::runThread() {
@@ -307,6 +322,8 @@ void RenderThread::unlockRenderMutex() {
 
 void RenderThread::clearFrameQueue() {
 	while(!frameQueue.empty()) {
+		RenderFrame *nextFrame = frameQueue.front();
+		framesToDelete.push_back(nextFrame);
 		frameQueue.pop();
 	}
 }
@@ -437,8 +454,9 @@ RenderThreadDebugInfo RenderThread::getFrameInfo() {
 void RenderThread::enqueueFrame(RenderFrame *frame) {
 	Services()->getCore()->lockMutex(jobQueueMutex);
 	frameQueue.push(frame);
-	if(frameQueue.size() > MAX_QUEUED_FRAMES) {
-		// drop frames if necessary
+	while(frameQueue.size() > MAX_QUEUED_FRAMES) {
+		RenderFrame *nextFrame = frameQueue.front();
+		framesToDelete.push_back(nextFrame);
 		frameQueue.pop();
 	}
 	Services()->getCore()->unlockMutex(jobQueueMutex);

+ 0 - 1
src/core/PolySceneMesh.cpp

@@ -193,7 +193,6 @@ void SceneMesh::setMaterial(Material *material) {
 		shaderPass.shaderBinding = new ShaderBinding();
 		shaderPass.shaderBinding->targetShader = shaderPass.shader;
 		shaderPass.shaderBinding->addParamPointer(ProgramParam::PARAM_COLOR, "entityColor", &color);
-		shaderPass.shaderBinding->resetAttributes = true;
 		if(skeleton) {
 		 //	  shaderPass.attributeArrays.push_back(&skeletalVertexPositions);
 		 //	  shaderPass.attributeArrays.push_back(&skeletalVertexNormals);

+ 0 - 1
src/ide/PolycodeEntityEditor.cpp

@@ -1820,7 +1820,6 @@ void EntityEditorMainView::setOverlayWireframeRecursive(Entity *targetEntity, bo
 				wireframePass.shaderBinding = new ShaderBinding();
 				wireframePass.shaderBinding->targetShader = wireframePass.shader;
 				wireframePass.blendingMode = Renderer::BLEND_MODE_NORMAL;
-				wireframePass.shaderBinding->resetAttributes = true;
 				wireframePass.shaderBinding->addParam(ProgramParam::PARAM_COLOR, "wireframeColor")->setColor(Color(0.5, 0.6, 1.0, 0.75));
 				
 				sceneMesh->addShaderPass(wireframePass);

+ 0 - 2
src/modules/ui/PolyUIBox.cpp

@@ -127,7 +127,6 @@ void UIBox::redrawMesh() {
 	}
 	
 	boxMesh->addSubmesh(newGeometry);
-	shaderPasses[0].shaderBinding->resetAttributes = true;
 }
 
 void UIBox::setMaterial(Material *material) {
@@ -146,7 +145,6 @@ void UIBox::setMaterial(Material *material) {
 	shaderPasses.push_back(pass);
 	
 	shaderPasses[0].shaderBinding->addParamPointer(ProgramParam::PARAM_COLOR, "entityColor", &color);
-	shaderPasses[0].shaderBinding->resetAttributes = true;
 }
 
 void UIBox::Render(GPUDrawBuffer *buffer) {

+ 0 - 1
src/modules/ui/PolyUIElement.cpp

@@ -337,7 +337,6 @@ void UIRect::setMaterial(Material *material) {
 	shaderPasses.push_back(pass);
 	
 	shaderPasses[0].shaderBinding->addParamPointer(ProgramParam::PARAM_COLOR, "entityColor", &color);
-	shaderPasses[0].shaderBinding->resetAttributes = true;
 }
 
 Texture *UIRect::getTexture() {