Prechádzať zdrojové kódy

fixed call to glMultiDrawElementsIndirect.

Zoadian 11 rokov pred
rodič
commit
5ce46407ff
3 zmenil súbory, kde vykonal 14 pridanie a 25 odobranie
  1. 3 3
      source/gl/buffer.d
  2. 8 18
      source/gl/renderer.d
  3. 3 4
      source/gl/sync.d

+ 3 - 3
source/gl/buffer.d

@@ -48,9 +48,9 @@ struct GlBuffer(GlBufferTarget Target, T) {
 		glCheck!glBindBuffer(Target, this.handle);
 	}
 	
-//	void unbind() {
-//		glCheck!glBindBuffer(Target, 0);
-//	}
+	void unbind() {
+		glCheck!glBindBuffer(Target, 0);
+	}
 }
 
 alias GlArrayBuffer(T) = GlBuffer!(GlBufferTarget.Array, T);

+ 8 - 18
source/gl/renderer.d

@@ -262,8 +262,6 @@ struct Renderer {
 	}
 
 	void renderOneFrame(ref Scene scene, ref Camera camera, ref GlRenderTarget renderTarget, ref Viewport viewport)  {
-		"-----------begin renderOneFrame---------".log;
-
 		// calc if we have to wrap our buffer
 		if(vertexRingbufferIndex + scene.modelData.vertexCount >= this.vertexBuffer.length) {
 			vertexRingbufferIndex = 0;
@@ -278,24 +276,21 @@ struct Renderer {
 		}
 
 		// wait until GPU has finished rendereing from our desired buffer destination
-		log("vertexSyncManager.waitForLockedRange ", vertexRingbufferIndex, ", ", scene.modelData.vertexCount); 
 		this.vertexSyncManager.waitForLockedRange(vertexRingbufferIndex, scene.modelData.vertexCount);
-		log("indexSyncManager.waitForLockedRange ", indexRingbufferIndex, ", ", scene.modelData.indexCount); 
 		this.indexSyncManager.waitForLockedRange(indexRingbufferIndex, scene.modelData.indexCount);
-		log("drawIndirectCommandSyncManager.waitForLockedRange ", drawIndirectCommandRingbufferIndex, ", ", scene.modelData.meshCount); 
 		this.drawIndirectCommandSyncManager.waitForLockedRange(drawIndirectCommandRingbufferIndex, scene.modelData.meshCount);
 
 		// bind buffers
-		this.vertexBuffer.bind();
-		this.indexBuffer.bind();
-		this.perInstanceParamBuffer.bind();
-		this.drawIndirectCommandBuffer.bind();
+		this.vertexBuffer.bind(); scope(exit) this.vertexBuffer.unbind();
+		this.indexBuffer.bind(); scope(exit) this.indexBuffer.unbind();
+		this.perInstanceParamBuffer.bind(); scope(exit) this.perInstanceParamBuffer.unbind();
+		this.drawIndirectCommandBuffer.bind(); scope(exit) this.drawIndirectCommandBuffer.unbind();
 
 		//bind gbuffer
 		glCheck!glBindFramebuffer(GL_DRAW_FRAMEBUFFER, gbuffer.fbo); scope(exit) glCheck!glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); 
 		GLenum[] drawBuffers = [GL_COLOR_ATTACHMENT0 + 0, GL_COLOR_ATTACHMENT0 + 1, GL_COLOR_ATTACHMENT0 + 2];
 		glCheck!glDrawBuffers(drawBuffers.length, drawBuffers.ptr); scope(exit) glCheck!glDrawBuffer(GL_NONE);
-		
+
 		// enable depth mask _before_ glClear ing the depth buffer!
 		glCheck!glDepthMask(GL_TRUE); scope(exit) glCheck!glDepthMask(GL_FALSE);
 		glCheck!glEnable(GL_DEPTH_TEST); scope(exit) glCheck!glDisable(GL_DEPTH_TEST);
@@ -336,21 +331,16 @@ struct Renderer {
 			++drawIndirectCommandRingbufferIndex;
 		}
 			
-		//bind pipeline
+		// bind pipeline
 		glCheck!glBindProgramPipeline(shaderPipeline.pipeline); scope(exit) glCheck!glBindProgramPipeline(0);
 
-		//draw
-		log("glMultiDrawElementsIndirect ", drawIndirectCommandRingbufferIndexForThisFrame, ", ", scene.modelData.meshCount, ", ", 0); 
-		glCheck!glMultiDrawElementsIndirect(GL_TRIANGLES, toGlType!(this.indexBuffer.ValueType), cast(const void*)drawIndirectCommandRingbufferIndexForThisFrame, scene.modelData.meshCount, 0);
+		// draw
+		glCheck!glMultiDrawElementsIndirect(GL_TRIANGLES, toGlType!(this.indexBuffer.ValueType), cast(const void*)(drawIndirectCommandRingbufferIndexForThisFrame * GlDrawElementsIndirectCommand.sizeof), scene.modelData.meshCount, 0);
 
 		// lock ranges
-		log("vertexSyncManager.lockRange ", vertexRingbufferIndexForThisFrame, ", ", scene.modelData.vertexCount); 
 		this.vertexSyncManager.lockRange(vertexRingbufferIndexForThisFrame, scene.modelData.vertexCount);
-		log("indexSyncManager.lockRange ", indexRingbufferIndexForThisFrame, ", ", scene.modelData.indexCount); 
 		this.indexSyncManager.lockRange(indexRingbufferIndexForThisFrame, scene.modelData.indexCount);
-		log("drawIndirectCommandSyncManager.lockRange ", drawIndirectCommandRingbufferIndexForThisFrame, ", ", scene.modelData.meshCount); 
 		this.drawIndirectCommandSyncManager.lockRange(drawIndirectCommandRingbufferIndexForThisFrame, scene.modelData.meshCount);
-		"-----------end renderOneFrame---------\n".log;
 	}
 	
 	debug {

+ 3 - 4
source/gl/sync.d

@@ -2,6 +2,7 @@
 
 public import derelict.opengl3.gl3;
 import three.gl.util;
+import std.experimental.logger;
 
 enum kOneSecondInNanoSeconds = GLuint64(1000000000);
 
@@ -45,14 +46,12 @@ public:
 				swapLocks ~= lock;
 			}
 		}
-		
-		import std.algorithm : swap;
-		swap(locks, swapLocks);
+
+		locks = swapLocks;
 	}
 	
 	void lockRange(size_t lockBeginOffset, size_t lockLength) nothrow {
 		LockRange newRange = LockRange(lockBeginOffset, lockLength);
-		//TODO: glCheck!
 		GLsync syncName = glCheck!glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
 		locks ~= Lock(newRange, syncName);
 	}