Pārlūkot izejas kodu

upload of mesh data and command data

Zoadian 11 gadi atpakaļ
vecāks
revīzija
43857a305c
4 mainītis faili ar 30 papildinājumiem un 186 dzēšanām
  1. 0 165
      LICENSE
  2. 0 3
      README.md
  3. 25 17
      source/gl/renderer.d
  4. 5 1
      source/three/mesh.d

+ 0 - 165
LICENSE

@@ -1,165 +0,0 @@
-GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-  This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-  0. Additional Definitions.
-
-  As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
-  "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-  An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-  A "Combined Work" is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
-  The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-  The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-  1. Exception to Section 3 of the GNU GPL.
-
-  You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-  2. Conveying Modified Versions.
-
-  If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-   a) under this License, provided that you make a good faith effort to
-   ensure that, in the event an Application does not supply the
-   function or data, the facility still operates, and performs
-   whatever part of its purpose remains meaningful, or
-
-   b) under the GNU GPL, with none of the additional permissions of
-   this License applicable to that copy.
-
-  3. Object Code Incorporating Material from Library Header Files.
-
-  The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-   a) Give prominent notice with each copy of the object code that the
-   Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the object code with a copy of the GNU GPL and this license
-   document.
-
-  4. Combined Works.
-
-  You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-   a) Give prominent notice with each copy of the Combined Work that
-   the Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
-   document.
-
-   c) For a Combined Work that displays copyright notices during
-   execution, include the copyright notice for the Library among
-   these notices, as well as a reference directing the user to the
-   copies of the GNU GPL and this license document.
-
-   d) Do one of the following:
-
-       0) Convey the Minimal Corresponding Source under the terms of this
-       License, and the Corresponding Application Code in a form
-       suitable for, and under terms that permit, the user to
-       recombine or relink the Application with a modified version of
-       the Linked Version to produce a modified Combined Work, in the
-       manner specified by section 6 of the GNU GPL for conveying
-       Corresponding Source.
-
-       1) Use a suitable shared library mechanism for linking with the
-       Library.  A suitable mechanism is one that (a) uses at run time
-       a copy of the Library already present on the user's computer
-       system, and (b) will operate properly with a modified version
-       of the Library that is interface-compatible with the Linked
-       Version.
-
-   e) Provide Installation Information, but only if you would otherwise
-   be required to provide such information under section 6 of the
-   GNU GPL, and only to the extent that such information is
-   necessary to install and execute a modified version of the
-   Combined Work produced by recombining or relinking the
-   Application with a modified version of the Linked Version. (If
-   you use option 4d0, the Installation Information must accompany
-   the Minimal Corresponding Source and Corresponding Application
-   Code. If you use option 4d1, you must provide the Installation
-   Information in the manner specified by section 6 of the GNU GPL
-   for conveying Corresponding Source.)
-
-  5. Combined Libraries.
-
-  You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-   a) Accompany the combined library with a copy of the same work based
-   on the Library, uncombined with any other library facilities,
-   conveyed under the terms of this License.
-
-   b) Give prominent notice with the combined library that part of it
-   is a work based on the Library, and explaining where to find the
-   accompanying uncombined form of the same work.
-
-  6. Revised Versions of the GNU Lesser General Public License.
-
-  The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-  Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-  If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.

+ 0 - 3
README.md

@@ -12,6 +12,3 @@ Three.d is high performance 3D graphics engine written from scratch in the D Pro
 * Virtual Textures (Megatextures)
 * Async Buffer Transfers [[1]](http://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-AsynchronousBufferTransfers.pdf)
 
-
-## License: 
-[LGPL v3 - GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007](http://www.gnu.org/licenses/lgpl.html)

+ 25 - 17
source/gl/renderer.d

@@ -219,10 +219,10 @@ struct Renderer {
 	GlSyncManager indexSyncManager;
 	GlSyncManager perInstanceParamSyncManager;
 	GlSyncManager dispatchIndirectCommandSyncManager;
-	size_t vertexRingbufferOffset = 0;
-	size_t indexRingbufferOffset = 0;
-	size_t perInstanceParamRingbufferOffset = 0;
-	size_t dispatchIndirectCommandRingbufferOffset = 0;
+	size_t vertexRingbufferIndex = 0;
+	size_t indexRingbufferIndex = 0;
+	size_t perInstanceParamRingbufferIndex = 0;
+	size_t dispatchIndirectCommandRingbufferIndex = 0;
 	
 	void construct(uint width, uint height) {
 		GLbitfield createFlags = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT;//TODO: ?? | GL_MAP_DYNAMIC_STORAGE_BIT;
@@ -293,27 +293,34 @@ struct Renderer {
 		glCheck!glClearColor(0, 0.3, 0, 1);
 
 		// calc if we have to wrap our buffer
-		if(vertexRingbufferOffset + scene.modelData.vertexCount >= this.vertexBuffer.length) {
-			vertexRingbufferOffset = 0;
+		if(vertexRingbufferIndex + scene.modelData.vertexCount >= this.vertexBuffer.length) {
+			vertexRingbufferIndex = 0;
 		}
 		
-		if(indexRingbufferOffset + scene.modelData.indexCount >= this.indexBuffer.length) {
-			indexRingbufferOffset = 0;
+		if(indexRingbufferIndex + scene.modelData.indexCount >= this.indexBuffer.length) {
+			indexRingbufferIndex = 0;
+		}
+		
+		if(dispatchIndirectCommandRingbufferIndex + scene.modelData.meshCount >= this.dispatchIndirectCommandBuffer.length) {
+			dispatchIndirectCommandRingbufferIndex = 0;
 		}
 
 		// wait until GPU has finished rendereing from our desired buffer destination
-		this.vertexSyncManager.waitForLockedRange(vertexRingbufferOffset, scene.modelData.vertexCount);
-		this.indexSyncManager.waitForLockedRange(indexRingbufferOffset, scene.modelData.indexCount);
+		this.vertexSyncManager.waitForLockedRange(vertexRingbufferIndex, scene.modelData.vertexCount);
+		this.indexSyncManager.waitForLockedRange(indexRingbufferIndex, scene.modelData.indexCount);
+		this.dispatchIndirectCommandSyncManager.waitForLockedRange(dispatchIndirectCommandRingbufferIndex, scene.modelData.meshCount);
 
 		// upload data to our buffers
 		foreach(meshData; scene.modelData.meshData) {
-			import std.c.string: memcpy;
 			// upload vertex data
-			memcpy(this.vertexBuffer.data + vertexRingbufferOffset, meshData.vertexData.ptr, meshData.vertexData.length * VertexData.sizeof);
-			vertexRingbufferOffset += meshData.vertexData.length * VertexData.sizeof;
+			this.vertexBuffer.data[vertexRingbufferIndex .. vertexRingbufferIndex + meshData.vertexData.length] = meshData.vertexData[0 .. meshData.vertexData.length];
+			vertexRingbufferIndex += meshData.vertexData.length;
 			// upload index data
-			memcpy(this.indexBuffer.data + indexRingbufferOffset, meshData.indexData.ptr, meshData.indexData.length * IndexData.sizeof);
-			indexRingbufferOffset += meshData.indexData.length * IndexData.sizeof;
+			this.indexBuffer.data[indexRingbufferIndex .. indexRingbufferIndex + meshData.indexData.length] = meshData.indexData[0 .. meshData.indexData.length];
+			indexRingbufferIndex += meshData.indexData.length;
+			// draw command data
+			this.dispatchIndirectCommandBuffer.data[dispatchIndirectCommandRingbufferIndex] = GlDrawElementsIndirectCommand();
+			dispatchIndirectCommandRingbufferIndex += GlDrawElementsIndirectCommand.sizeof;
 		}
 
 
@@ -353,8 +360,9 @@ struct Renderer {
 		
 		glCheck!glMultiDrawElementsIndirect(GL_TRIANGLES, toGlType!(this.indexBuffer.ValueType), null, meshCount, 0);
 
-		this.vertexSyncManager.lockRange(vertexRingbufferOffset, scene.modelData.vertexCount);
-		this.indexSyncManager.lockRange(indexRingbufferOffset, scene.modelData.indexCount);
+		this.vertexSyncManager.lockRange(vertexRingbufferIndex, scene.modelData.vertexCount);
+		this.indexSyncManager.lockRange(indexRingbufferIndex, scene.modelData.indexCount);
+		this.dispatchIndirectCommandSyncManager.lockRange(dispatchIndirectCommandRingbufferIndex, scene.modelData.meshCount);
 	}
 	
 	debug {

+ 5 - 1
source/three/mesh.d

@@ -15,7 +15,7 @@ struct MeshData {
 
 struct ModelData {
 	MeshData[] meshData;
-	
+
 	size_t vertexCount() const @safe {
 		import std.algorithm : map, reduce;
 		return meshData.map!("a.vertexData.length").reduce!("a + b");
@@ -25,6 +25,10 @@ struct ModelData {
 		import std.algorithm : map, reduce;
 		return meshData.map!("a.indexData.length").reduce!("a + b");
 	}
+
+	size_t meshCount() const @safe {
+		return meshData.length;
+	}
 }
 
 ModelData loadModelData(string filePath) {