Browse Source

Exposed vertex stream argument to API.

Branimir Karadžić 8 years ago
parent
commit
68c6b46a65
36 changed files with 121 additions and 136 deletions
  1. 8 30
      examples/01-cubes/cubes.cpp
  2. 1 1
      examples/02-metaballs/metaballs.cpp
  3. 1 1
      examples/03-raymarch/raymarch.cpp
  4. 1 1
      examples/05-instancing/instancing.cpp
  5. 2 2
      examples/06-bump/bump.cpp
  6. 1 1
      examples/07-callback/callback.cpp
  7. 5 5
      examples/08-update/update.cpp
  8. 1 1
      examples/09-hdr/hdr.cpp
  9. 1 1
      examples/13-stencil/stencil.cpp
  10. 7 7
      examples/14-shadowvolumes/shadowvolumes.cpp
  11. 1 1
      examples/15-shadowmaps-simple/shadowmaps_simple.cpp
  12. 3 3
      examples/16-shadowmaps/shadowmaps.cpp
  13. 1 1
      examples/17-drawstress/drawstress.cpp
  14. 1 1
      examples/18-ibl/ibl.cpp
  15. 2 2
      examples/19-oit/oit.cpp
  16. 4 4
      examples/21-deferred/deferred.cpp
  17. 1 1
      examples/22-windows/windows.cpp
  18. 2 2
      examples/23-vectordisplay/vectordisplay.cpp
  19. 1 1
      examples/24-nbody/nbody.cpp
  20. 3 3
      examples/26-occlusion/occlusion.cpp
  21. 3 3
      examples/27-terrain/terrain.cpp
  22. 1 1
      examples/31-rsm/reflectiveshadowmap.cpp
  23. 1 1
      examples/33-pom/pom.cpp
  24. 2 2
      examples/common/bgfx_utils.cpp
  25. 3 3
      examples/common/debugdraw/debugdraw.cpp
  26. 3 3
      examples/common/font/text_buffer_manager.cpp
  27. 4 4
      examples/common/imgui/imgui.cpp
  28. 1 1
      examples/common/imgui/ocornut_imgui.cpp
  29. 7 7
      examples/common/nanovg/nanovg_bgfx.cpp
  30. 1 1
      examples/common/ps/particle_system.cpp
  31. 28 6
      include/bgfx/bgfx.h
  32. 3 3
      include/bgfx/c99/bgfx.h
  33. 3 3
      include/bgfx/c99/platform.h
  34. 1 1
      include/bgfx/defines.h
  35. 12 27
      src/bgfx.cpp
  36. 1 1
      tools/texturev/texturev.cpp

+ 8 - 30
examples/01-cubes/cubes.cpp

@@ -6,11 +6,6 @@
 #include "common.h"
 #include "bgfx_utils.h"
 
-namespace bgfx
-{
-	void setVertexBuffer(uint8_t _stream, VertexBufferHandle _handle, uint32_t _startVertex = 0, uint32_t _numVertices = UINT32_MAX);
-}
-
 struct PosColorVertex
 {
 	float m_x;
@@ -20,25 +15,17 @@ struct PosColorVertex
 
 	static void init()
 	{
-		ms_decl0
+		ms_decl
 			.begin()
 			.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float)
-			.skip(4)
-			.end();
-
-		ms_decl1
-			.begin()
-			.skip(12)
 			.add(bgfx::Attrib::Color0,   4, bgfx::AttribType::Uint8, true)
 			.end();
 	};
 
-	static bgfx::VertexDecl ms_decl0;
-	static bgfx::VertexDecl ms_decl1;
+	static bgfx::VertexDecl ms_decl;
 };
 
-bgfx::VertexDecl PosColorVertex::ms_decl0;
-bgfx::VertexDecl PosColorVertex::ms_decl1;
+bgfx::VertexDecl PosColorVertex::ms_decl;
 
 static PosColorVertex s_cubeVertices[] =
 {
@@ -115,16 +102,10 @@ class ExampleCubes : public entry::AppI
 		PosColorVertex::init();
 
 		// Create static vertex buffer.
-		m_vbh0 = bgfx::createVertexBuffer(
-				// Static data can be passed with bgfx::makeRef
-				bgfx::makeRef(s_cubeVertices, sizeof(s_cubeVertices) )
-				, PosColorVertex::ms_decl0
-				);
-
-		m_vbh1 = bgfx::createVertexBuffer(
+		m_vbh = bgfx::createVertexBuffer(
 				// Static data can be passed with bgfx::makeRef
 				bgfx::makeRef(s_cubeVertices, sizeof(s_cubeVertices) )
-				, PosColorVertex::ms_decl1
+				, PosColorVertex::ms_decl
 				);
 
 		// Create static index buffer.
@@ -143,8 +124,7 @@ class ExampleCubes : public entry::AppI
 	{
 		// Cleanup.
 		bgfx::destroyIndexBuffer(m_ibh);
-		bgfx::destroyVertexBuffer(m_vbh0);
-		bgfx::destroyVertexBuffer(m_vbh1);
+		bgfx::destroyVertexBuffer(m_vbh);
 		bgfx::destroyProgram(m_program);
 
 		// Shutdown bgfx.
@@ -221,8 +201,7 @@ class ExampleCubes : public entry::AppI
 					bgfx::setTransform(mtx);
 
 					// Set vertex and index buffer.
-					bgfx::setVertexBuffer(0, m_vbh0);
-					bgfx::setVertexBuffer(1, m_vbh1);
+					bgfx::setVertexBuffer(0, m_vbh);
 					bgfx::setIndexBuffer(m_ibh);
 
 					// Set render states.
@@ -250,8 +229,7 @@ class ExampleCubes : public entry::AppI
 	uint32_t m_height;
 	uint32_t m_debug;
 	uint32_t m_reset;
-	bgfx::VertexBufferHandle m_vbh0;
-	bgfx::VertexBufferHandle m_vbh1;
+	bgfx::VertexBufferHandle m_vbh;
 	bgfx::IndexBufferHandle m_ibh;
 	bgfx::ProgramHandle m_program;
 	int64_t m_timeOffset;

+ 1 - 1
examples/02-metaballs/metaballs.cpp

@@ -726,7 +726,7 @@ class ExampleMetaballs : public entry::AppI
 			bgfx::setTransform(mtx);
 
 			// Set vertex and index buffer.
-			bgfx::setVertexBuffer(&tvb, 0, numVertices);
+			bgfx::setVertexBuffer(0, &tvb, 0, numVertices);
 
 			// Set render states.
 			bgfx::setState(BGFX_STATE_DEFAULT);

+ 1 - 1
examples/03-raymarch/raymarch.cpp

@@ -97,7 +97,7 @@ void renderScreenSpaceQuad(uint8_t _view, bgfx::ProgramHandle _program, float _x
 
 		bgfx::setState(BGFX_STATE_DEFAULT);
 		bgfx::setIndexBuffer(&tib);
-		bgfx::setVertexBuffer(&tvb);
+		bgfx::setVertexBuffer(0, &tvb);
 		bgfx::submit(_view, _program);
 	}
 }

+ 1 - 1
examples/05-instancing/instancing.cpp

@@ -209,7 +209,7 @@ class ExampleInstancing : public entry::AppI
 					}
 
 					// Set vertex and index buffer.
-					bgfx::setVertexBuffer(m_vbh);
+					bgfx::setVertexBuffer(0, m_vbh);
 					bgfx::setIndexBuffer(m_ibh);
 
 					// Set instance data buffer.

+ 2 - 2
examples/06-bump/bump.cpp

@@ -270,7 +270,7 @@ class ExampleBump : public entry::AppI
 						bgfx::setInstanceDataBuffer(idb, numInstances);
 
 						// Set vertex and index buffer.
-						bgfx::setVertexBuffer(m_vbh);
+						bgfx::setVertexBuffer(0, m_vbh);
 						bgfx::setIndexBuffer(m_ibh);
 
 						// Bind textures.
@@ -307,7 +307,7 @@ class ExampleBump : public entry::AppI
 						bgfx::setTransform(mtx);
 
 						// Set vertex and index buffer.
-						bgfx::setVertexBuffer(m_vbh);
+						bgfx::setVertexBuffer(0, m_vbh);
 						bgfx::setIndexBuffer(m_ibh);
 
 						// Bind textures.

+ 1 - 1
examples/07-callback/callback.cpp

@@ -425,7 +425,7 @@ int _main_(int _argc, char** _argv)
 				bgfx::setTransform(mtx);
 
 				// Set vertex and index buffer.
-				bgfx::setVertexBuffer(vbh);
+				bgfx::setVertexBuffer(0, vbh);
 				bgfx::setIndexBuffer(ibh);
 
 				// Set render states.

+ 5 - 5
examples/08-update/update.cpp

@@ -475,7 +475,7 @@ public:
 					bgfx::setTransform( mtx );
 
 					// Set vertex and index buffer.
-					bgfx::setVertexBuffer( m_vbh );
+					bgfx::setVertexBuffer(0,  m_vbh );
 					bgfx::setIndexBuffer( m_ibh );
 
 					// Bind texture.
@@ -502,7 +502,7 @@ public:
 			bgfx::setTransform(mtx);
 
 			// Set vertex and index buffer.
-			bgfx::setVertexBuffer(m_vbh);
+			bgfx::setVertexBuffer(0, m_vbh);
 			bgfx::setIndexBuffer(m_ibh);
 
 			// Bind texture.
@@ -524,7 +524,7 @@ public:
 				bgfx::setTransform(mtx);
 
 				// Set vertex and index buffer.
-				bgfx::setVertexBuffer(m_vbh);
+				bgfx::setVertexBuffer(0, m_vbh);
 				bgfx::setIndexBuffer(m_ibh, 0, 6);
 
 				// Bind texture.
@@ -545,7 +545,7 @@ public:
 				bgfx::setTransform(mtx);
 
 				// Set vertex and index buffer.
-				bgfx::setVertexBuffer(m_vbh);
+				bgfx::setVertexBuffer(0, m_vbh);
 				bgfx::setIndexBuffer(m_ibh, 0, 6);
 
 				// Bind texture.
@@ -566,7 +566,7 @@ public:
 				bgfx::setTransform(mtx);
 
 				// Set vertex and index buffer.
-				bgfx::setVertexBuffer(m_vbh, 24, 4);
+				bgfx::setVertexBuffer(0, m_vbh, 24, 4);
 				bgfx::setIndexBuffer(m_ibh, 0, 6);
 
 				// Bind texture.

+ 1 - 1
examples/09-hdr/hdr.cpp

@@ -88,7 +88,7 @@ void screenSpaceQuad(float _textureWidth, float _textureHeight, bool _originBott
 		vertex[2].m_u = maxu;
 		vertex[2].m_v = maxv;
 
-		bgfx::setVertexBuffer(&vb);
+		bgfx::setVertexBuffer(0, &vb);
 	}
 }
 

+ 1 - 1
examples/13-stencil/stencil.cpp

@@ -767,7 +767,7 @@ struct Mesh
 			// Set model matrix for rendering.
 			bgfx::setTransform(_mtx);
 			bgfx::setIndexBuffer(group.m_ibh);
-			bgfx::setVertexBuffer(group.m_vbh);
+			bgfx::setVertexBuffer(0, group.m_vbh);
 
 			// Set texture
 			if (bgfx::invalidHandle != _texture.idx)

+ 7 - 7
examples/14-shadowvolumes/shadowvolumes.cpp

@@ -1141,7 +1141,7 @@ struct Model
 
 			// Set buffers
 			bgfx::setIndexBuffer(group.m_ibh);
-			bgfx::setVertexBuffer(group.m_vbh);
+			bgfx::setVertexBuffer(0, group.m_vbh);
 
 			// Set textures
 			if (bgfx::invalidHandle != m_texture.idx)
@@ -2674,7 +2674,7 @@ int _main_(int _argc, char** _argv)
 
 					s_uniforms.submitPerDrawUniforms();
 					bgfx::setTransform(shadowVolumeMtx);
-					bgfx::setVertexBuffer(shadowVolume.m_vbSides);
+					bgfx::setVertexBuffer(0, shadowVolume.m_vbSides);
 					bgfx::setIndexBuffer(shadowVolume.m_ibSides);
 					setRenderState(renderStateCraftStencil);
 					::submit(viewId, svProgs[programIndex][ShadowVolumePart::Side]);
@@ -2683,14 +2683,14 @@ int _main_(int _argc, char** _argv)
 					{
 						s_uniforms.submitPerDrawUniforms();
 						bgfx::setTransform(shadowVolumeMtx);
-						bgfx::setVertexBuffer(group.m_vbh);
+						bgfx::setVertexBuffer(0, group.m_vbh);
 						bgfx::setIndexBuffer(shadowVolume.m_ibFrontCap);
 						setRenderState(renderStateCraftStencil);
 						::submit(viewId, svProgs[programIndex][ShadowVolumePart::Front]);
 
 						s_uniforms.submitPerDrawUniforms();
 						bgfx::setTransform(shadowVolumeMtx);
-						bgfx::setVertexBuffer(group.m_vbh);
+						bgfx::setVertexBuffer(0, group.m_vbh);
 						bgfx::setIndexBuffer(shadowVolume.m_ibBackCap);
 						::setRenderState(renderStateCraftStencil);
 						::submit(viewId, svProgs[programIndex][ShadowVolumePart::Back]);
@@ -2702,7 +2702,7 @@ int _main_(int _argc, char** _argv)
 
 						s_uniforms.submitPerDrawUniforms();
 						bgfx::setTransform(shadowVolumeMtx);
-						bgfx::setVertexBuffer(shadowVolume.m_vbSides);
+						bgfx::setVertexBuffer(0, shadowVolume.m_vbSides);
 						bgfx::setIndexBuffer(shadowVolume.m_ibSides);
 						::setRenderState(renderState);
 						::submit(VIEWID_RANGE1_PASS3, svProgs[ShadowVolumeProgramType::Color][ShadowVolumePart::Side]);
@@ -2711,14 +2711,14 @@ int _main_(int _argc, char** _argv)
 						{
 							s_uniforms.submitPerDrawUniforms();
 							bgfx::setTransform(shadowVolumeMtx);
-							bgfx::setVertexBuffer(group.m_vbh);
+							bgfx::setVertexBuffer(0, group.m_vbh);
 							bgfx::setIndexBuffer(shadowVolume.m_ibFrontCap);
 							::setRenderState(renderState);
 							::submit(VIEWID_RANGE1_PASS3, svProgs[ShadowVolumeProgramType::Color][ShadowVolumePart::Front]);
 
 							s_uniforms.submitPerDrawUniforms();
 							bgfx::setTransform(shadowVolumeMtx);
-							bgfx::setVertexBuffer(group.m_vbh);
+							bgfx::setVertexBuffer(0, group.m_vbh);
 							bgfx::setIndexBuffer(shadowVolume.m_ibBackCap);
 							::setRenderState(renderState);
 							::submit(VIEWID_RANGE1_PASS3, svProgs[ShadowVolumeProgramType::Color][ShadowVolumePart::Back]);

+ 1 - 1
examples/15-shadowmaps-simple/shadowmaps_simple.cpp

@@ -311,7 +311,7 @@ int _main_(int _argc, char** _argv)
 			}
 			bgfx::setUniform(u_lightMtx, lightMtx);
 			bgfx::setIndexBuffer(ibh);
-			bgfx::setVertexBuffer(vbh);
+			bgfx::setVertexBuffer(0, vbh);
 			bgfx::setState(st.m_state);
 			bgfx::submit(st.m_viewId, st.m_program);
 		}

+ 3 - 3
examples/16-shadowmaps/shadowmaps.cpp

@@ -976,7 +976,7 @@ struct Mesh
 			// Set model matrix for rendering.
 			bgfx::setTransform(_mtx);
 			bgfx::setIndexBuffer(group.m_ibh);
-			bgfx::setVertexBuffer(group.m_vbh);
+			bgfx::setVertexBuffer(0, group.m_vbh);
 
 			// Set textures.
 			if (bgfx::invalidHandle != _texture.idx)
@@ -1081,7 +1081,7 @@ void screenSpaceQuad(float _textureWidth, float _textureHeight, bool _originBott
 		vertex[2].m_u = maxu;
 		vertex[2].m_v = maxv;
 
-		bgfx::setVertexBuffer(&vb);
+		bgfx::setVertexBuffer(0, &vb);
 	}
 }
 
@@ -2714,7 +2714,7 @@ int _main_(int _argc, char** _argv)
 							| BGFX_STENCIL_OP_FAIL_Z_REPLACE
 							| BGFX_STENCIL_OP_PASS_Z_REPLACE
 							);
-					bgfx::setVertexBuffer(&vb);
+					bgfx::setVertexBuffer(0, &vb);
 					bgfx::submit(RENDERVIEW_SHADOWMAP_0_ID, s_programs.m_black);
 				}
 			}

+ 1 - 1
examples/17-drawstress/drawstress.cpp

@@ -291,7 +291,7 @@ class ExampleDrawStress : public entry::AppI
 						bgfx::setTransform(mtx);
 
 						// Set vertex and index buffer.
-						bgfx::setVertexBuffer(m_vbh);
+						bgfx::setVertexBuffer(0, m_vbh);
 						bgfx::setIndexBuffer(m_ibh);
 
 						// Set render states.

+ 1 - 1
examples/18-ibl/ibl.cpp

@@ -138,7 +138,7 @@ void screenSpaceQuad(float _textureWidth, float _textureHeight, bool _originBott
 		vertex[2].m_u = maxu;
 		vertex[2].m_v = maxv;
 
-		bgfx::setVertexBuffer(&vb);
+		bgfx::setVertexBuffer(0, &vb);
 	}
 }
 

+ 2 - 2
examples/19-oit/oit.cpp

@@ -142,7 +142,7 @@ void screenSpaceQuad(float _textureWidth, float _textureHeight, bool _originBott
 		vertex[2].m_u = maxu;
 		vertex[2].m_v = maxv;
 
-		bgfx::setVertexBuffer(&vb);
+		bgfx::setVertexBuffer(0, &vb);
 	}
 }
 
@@ -399,7 +399,7 @@ class ExampleOIT : public entry::AppI
 						bgfx::setTransform(mtx);
 
 						// Set vertex and index buffer.
-						bgfx::setVertexBuffer(m_vbh);
+						bgfx::setVertexBuffer(0, m_vbh);
 						bgfx::setIndexBuffer(m_ibh);
 
 						const uint64_t state = 0

+ 4 - 4
examples/21-deferred/deferred.cpp

@@ -183,7 +183,7 @@ void screenSpaceQuad(float _textureWidth, float _textureHeight, float _texelHalf
 		vertex[2].m_u = maxu;
 		vertex[2].m_v = maxv;
 
-		bgfx::setVertexBuffer(&vb);
+		bgfx::setVertexBuffer(0, &vb);
 	}
 }
 
@@ -520,7 +520,7 @@ class ExampleDeferred : public entry::AppI
 						bgfx::setTransform(mtx);
 
 						// Set vertex and index buffer.
-						bgfx::setVertexBuffer(m_vbh);
+						bgfx::setVertexBuffer(0, m_vbh);
 						bgfx::setIndexBuffer(m_ibh);
 
 						// Bind textures.
@@ -635,7 +635,7 @@ class ExampleDeferred : public entry::AppI
 								*indices++ = 3;
 								*indices++ = 0;
 
-								bgfx::setVertexBuffer(&tvb);
+								bgfx::setVertexBuffer(0, &tvb);
 								bgfx::setIndexBuffer(&tib);
 								bgfx::setState(0
 										| BGFX_STATE_RGB_WRITE
@@ -698,7 +698,7 @@ class ExampleDeferred : public entry::AppI
 								);
 
 						bgfx::setTransform(mtx);
-						bgfx::setVertexBuffer(m_vbh);
+						bgfx::setVertexBuffer(0, m_vbh);
 						bgfx::setIndexBuffer(m_ibh, 0, 6);
 						bgfx::setTexture(0, s_texColor, m_gbufferTex[ii]);
 						bgfx::setState(BGFX_STATE_RGB_WRITE);

+ 1 - 1
examples/22-windows/windows.cpp

@@ -278,7 +278,7 @@ public:
 					bgfx::setTransform(mtx);
 
 					// Set vertex and index buffer.
-					bgfx::setVertexBuffer(m_vbh);
+					bgfx::setVertexBuffer(0, m_vbh);
 					bgfx::setIndexBuffer(m_ibh);
 
 					// Set render states.

+ 2 - 2
examples/23-vectordisplay/vectordisplay.cpp

@@ -176,7 +176,7 @@ void VectorDisplay::endFrame()
 
 			bgfx::setTexture(0, s_texColor, m_lineTexId);
 
-			bgfx::setVertexBuffer(m_vertexBuffers[i], 0, m_vertexBuffersSize[i]); // explicitly feed vertex number!
+			bgfx::setVertexBuffer(0, m_vertexBuffers[i], 0, m_vertexBuffersSize[i]); // explicitly feed vertex number!
 
 			bgfx::setState(0
 				| BGFX_STATE_RGB_WRITE
@@ -793,7 +793,7 @@ void VectorDisplay::screenSpaceQuad(float _textureWidth, float _textureHeight, f
 		vertex[2].m_u = maxu;
 		vertex[2].m_v = maxv;
 
-		bgfx::setVertexBuffer(&vb);
+		bgfx::setVertexBuffer(0, &vb);
 	}
 }
 

+ 1 - 1
examples/24-nbody/nbody.cpp

@@ -324,7 +324,7 @@ int _main_(int _argc, char** _argv)
 			}
 
 			// Set vertex and index buffer.
-			bgfx::setVertexBuffer(vbh);
+			bgfx::setVertexBuffer(0, vbh);
 			bgfx::setIndexBuffer(ibh);
 			bgfx::setInstanceDataBuffer(currPositionBuffer0, 0, u_paramsData.dispatchSize * threadGroupUpdateSize);
 

+ 3 - 3
examples/26-occlusion/occlusion.cpp

@@ -224,14 +224,14 @@ class ExampleOcclusion : public entry::AppI
 					bgfx::OcclusionQueryHandle occlusionQuery = m_occlusionQueries[yy*CUBES_DIM+xx];
 
 					bgfx::setTransform(mtx);
-					bgfx::setVertexBuffer(m_vbh);
+					bgfx::setVertexBuffer(0, m_vbh);
 					bgfx::setIndexBuffer(m_ibh);
 					bgfx::setCondition(occlusionQuery, true);
 					bgfx::setState(BGFX_STATE_DEFAULT);
 					bgfx::submit(0, m_program);
 
 					bgfx::setTransform(mtx);
-					bgfx::setVertexBuffer(m_vbh);
+					bgfx::setVertexBuffer(0, m_vbh);
 					bgfx::setIndexBuffer(m_ibh);
 					bgfx::setState(0
 						| BGFX_STATE_DEPTH_TEST_LEQUAL
@@ -240,7 +240,7 @@ class ExampleOcclusion : public entry::AppI
 					bgfx::submit(1, m_program, occlusionQuery);
 
 					bgfx::setTransform(mtx);
-					bgfx::setVertexBuffer(m_vbh);
+					bgfx::setVertexBuffer(0, m_vbh);
 					bgfx::setIndexBuffer(m_ibh);
 					bgfx::setCondition(occlusionQuery, true);
 					bgfx::setState(BGFX_STATE_DEFAULT);

+ 3 - 3
examples/27-terrain/terrain.cpp

@@ -466,19 +466,19 @@ class ExampleTerrain : public entry::AppI
 			switch (m_terrain.m_mode)
 			{
 			default:
-				bgfx::setVertexBuffer(m_vbh);
+				bgfx::setVertexBuffer(0, m_vbh);
 				bgfx::setIndexBuffer(m_ibh);
 				bgfx::submit(0, m_terrainProgram);
 				break;
 
 			case 1:
-				bgfx::setVertexBuffer(m_dvbh);
+				bgfx::setVertexBuffer(0, m_dvbh);
 				bgfx::setIndexBuffer(m_dibh);
 				bgfx::submit(0, m_terrainProgram);
 				break;
 
 			case 2:
-				bgfx::setVertexBuffer(m_vbh);
+				bgfx::setVertexBuffer(0, m_vbh);
 				bgfx::setIndexBuffer(m_ibh);
 				bgfx::setTexture(0, s_heightTexture, m_heightTexture);
 				bgfx::submit(0, m_terrainHeightTextureProgram);

+ 1 - 1
examples/31-rsm/reflectiveshadowmap.cpp

@@ -176,7 +176,7 @@ void screenSpaceQuad(float _textureWidth, float _textureHeight, float _texelHalf
 		vertex[2].m_u = maxu;
 		vertex[2].m_v = maxv;
 
-		bgfx::setVertexBuffer(&vb);
+		bgfx::setVertexBuffer(0, &vb);
 	}
 }
 

+ 1 - 1
examples/33-pom/pom.cpp

@@ -324,7 +324,7 @@ class ExamplePom : public entry::AppI
 			bgfx::setUniform(u_norm_mtx, transpose);
 
 			// Set vertex and index buffer.
-			bgfx::setVertexBuffer(m_vbh);
+			bgfx::setVertexBuffer(0, m_vbh);
 			bgfx::setIndexBuffer(m_ibh);
 
 			// Bind textures.

+ 2 - 2
examples/common/bgfx_utils.cpp

@@ -547,7 +547,7 @@ struct Mesh
 			const Group& group = *it;
 
 			bgfx::setIndexBuffer(group.m_ibh);
-			bgfx::setVertexBuffer(group.m_vbh);
+			bgfx::setVertexBuffer(0, group.m_vbh);
 			bgfx::submit(_id, _program, 0, it != itEnd-1);
 		}
 	}
@@ -578,7 +578,7 @@ struct Mesh
 				const Group& group = *it;
 
 				bgfx::setIndexBuffer(group.m_ibh);
-				bgfx::setVertexBuffer(group.m_vbh);
+				bgfx::setVertexBuffer(0, group.m_vbh);
 				bgfx::submit(state.m_viewId, state.m_program, 0, it != itEnd-1);
 			}
 		}

+ 3 - 3
examples/common/debugdraw/debugdraw.cpp

@@ -1818,7 +1818,7 @@ private:
 		bgfx::setUniform(u_params, params, 4);
 
 		bgfx::setTransform(_mtx, _num);
-		bgfx::setVertexBuffer(m_vbh, mesh.m_startVertex, mesh.m_numVertices);
+		bgfx::setVertexBuffer(0, m_vbh, mesh.m_startVertex, mesh.m_numVertices);
 		bgfx::setState(0
 				| attrib.m_state
 				| (_wireframe ? BGFX_STATE_PT_LINES|BGFX_STATE_LINEAA|BGFX_STATE_BLEND_ALPHA
@@ -1851,7 +1851,7 @@ private:
 
 				const Attrib& attrib = m_attrib[m_stack];
 
-				bgfx::setVertexBuffer(&tvb);
+				bgfx::setVertexBuffer(0, &tvb);
 				bgfx::setIndexBuffer(&tib);
 				bgfx::setState(0
 						| BGFX_STATE_RGB_WRITE
@@ -1900,7 +1900,7 @@ private:
 
 				const Attrib& attrib = m_attrib[m_stack];
 
-				bgfx::setVertexBuffer(&tvb);
+				bgfx::setVertexBuffer(0, &tvb);
 				bgfx::setIndexBuffer(&tib);
 				bgfx::setState(0
 						| (attrib.m_state & ~BGFX_STATE_CULL_MASK)

+ 3 - 3
examples/common/font/text_buffer_manager.cpp

@@ -750,7 +750,7 @@ void TextBufferManager::submitTextBuffer(TextBufferHandle _handle, uint8_t _id,
 				ibh.idx = bc.indexBufferHandleIdx;
 			}
 
-			bgfx::setVertexBuffer(vbh, 0, bc.textBuffer->getVertexCount() );
+			bgfx::setVertexBuffer(0, vbh, 0, bc.textBuffer->getVertexCount() );
 			bgfx::setIndexBuffer(ibh, 0, bc.textBuffer->getIndexCount() );
 		}
 		break;
@@ -790,7 +790,7 @@ void TextBufferManager::submitTextBuffer(TextBufferHandle _handle, uint8_t _id,
 						);
 			}
 
-			bgfx::setVertexBuffer(vbh, 0, bc.textBuffer->getVertexCount() );
+			bgfx::setVertexBuffer(0, vbh, 0, bc.textBuffer->getVertexCount() );
 			bgfx::setIndexBuffer(ibh, 0, bc.textBuffer->getIndexCount() );
 		}
 		break;
@@ -803,7 +803,7 @@ void TextBufferManager::submitTextBuffer(TextBufferHandle _handle, uint8_t _id,
 			bgfx::allocTransientVertexBuffer(&tvb, bc.textBuffer->getVertexCount(), m_vertexDecl);
 			bx::memCopy(tib.data, bc.textBuffer->getIndexBuffer(), indexSize);
 			bx::memCopy(tvb.data, bc.textBuffer->getVertexBuffer(), vertexSize);
-			bgfx::setVertexBuffer(&tvb, 0, bc.textBuffer->getVertexCount() );
+			bgfx::setVertexBuffer(0, &tvb, 0, bc.textBuffer->getVertexCount() );
 			bgfx::setIndexBuffer(&tib, 0, bc.textBuffer->getIndexCount() );
 		}
 		break;

+ 4 - 4
examples/common/imgui/imgui.cpp

@@ -1887,7 +1887,7 @@ struct Imgui
 
 			bgfx::setTransform(mtx);
 			bgfx::setTexture(0, s_texColor, _cubemap);
-			bgfx::setVertexBuffer(&tvb);
+			bgfx::setVertexBuffer(0, &tvb);
 			bgfx::setIndexBuffer(&tib);
 			bgfx::setState(BGFX_STATE_RGB_WRITE
 						  |BGFX_STATE_ALPHA_WRITE
@@ -2396,7 +2396,7 @@ struct Imgui
 				++vertex;
 			}
 
-			bgfx::setVertexBuffer(&tvb);
+			bgfx::setVertexBuffer(0, &tvb);
 			bgfx::setState(0
 				| BGFX_STATE_RGB_WRITE
 				| BGFX_STATE_ALPHA_WRITE
@@ -2701,7 +2701,7 @@ struct Imgui
 			}
 
 			bgfx::setTexture(0, s_texColor, m_fonts[m_currentFontIdx].m_texture);
-			bgfx::setVertexBuffer(&tvb);
+			bgfx::setVertexBuffer(0, &tvb);
 			bgfx::setState(0
 				| BGFX_STATE_RGB_WRITE
 				| BGFX_STATE_ALPHA_WRITE
@@ -2766,7 +2766,7 @@ struct Imgui
 			vertex[5].m_u = minu;
 			vertex[5].m_v = minv;
 
-			bgfx::setVertexBuffer(&vb);
+			bgfx::setVertexBuffer(0, &vb);
 
 			return true;
 		}

+ 1 - 1
examples/common/imgui/ocornut_imgui.cpp

@@ -148,7 +148,7 @@ struct OcornutImguiContext
 
 					bgfx::setState(state);
 					bgfx::setTexture(0, s_tex, th);
-					bgfx::setVertexBuffer(&tvb, 0, numVertices);
+					bgfx::setVertexBuffer(0, &tvb, 0, numVertices);
 					bgfx::setIndexBuffer(&tib, offset, cmd->ElemCount);
 					bgfx::submit(cmd->ViewId, program);
 				}

+ 7 - 7
examples/common/nanovg/nanovg_bgfx.cpp

@@ -587,7 +587,7 @@ namespace
 					| BGFX_STENCIL_OP_FAIL_Z_KEEP
 					| BGFX_STENCIL_OP_PASS_Z_DECR
 					);
-				bgfx::setVertexBuffer(&gl->tvb);
+				bgfx::setVertexBuffer(0, &gl->tvb);
 				bgfx::setTexture(0, gl->s_tex, gl->th);
 				fan(paths[i].fillOffset, paths[i].fillCount);
 				bgfx::submit(gl->m_viewId, gl->prog);
@@ -612,7 +612,7 @@ namespace
 					| BGFX_STENCIL_OP_FAIL_Z_KEEP
 					| BGFX_STENCIL_OP_PASS_Z_KEEP
 					);
-				bgfx::setVertexBuffer(&gl->tvb, paths[i].strokeOffset, paths[i].strokeCount);
+				bgfx::setVertexBuffer(0, &gl->tvb, paths[i].strokeOffset, paths[i].strokeCount);
 				bgfx::setTexture(0, gl->s_tex, gl->th);
 				bgfx::submit(gl->m_viewId, gl->prog);
 			}
@@ -620,7 +620,7 @@ namespace
 
 		// Draw fill
 		bgfx::setState(gl->state);
-		bgfx::setVertexBuffer(&gl->tvb, call->vertexOffset, call->vertexCount);
+		bgfx::setVertexBuffer(0, &gl->tvb, call->vertexOffset, call->vertexCount);
 		bgfx::setTexture(0, gl->s_tex, gl->th);
 		bgfx::setStencil(0
 				| BGFX_STENCIL_TEST_NOTEQUAL
@@ -643,7 +643,7 @@ namespace
 		{
 			if (paths[i].fillCount == 0) continue;
 			bgfx::setState(gl->state);
-			bgfx::setVertexBuffer(&gl->tvb);
+			bgfx::setVertexBuffer(0, &gl->tvb);
 			bgfx::setTexture(0, gl->s_tex, gl->th);
 			fan(paths[i].fillOffset, paths[i].fillCount);
 			bgfx::submit(gl->m_viewId, gl->prog);
@@ -657,7 +657,7 @@ namespace
 				bgfx::setState(gl->state
 					| BGFX_STATE_PT_TRISTRIP
 					);
-				bgfx::setVertexBuffer(&gl->tvb, paths[i].strokeOffset, paths[i].strokeCount);
+				bgfx::setVertexBuffer(0, &gl->tvb, paths[i].strokeOffset, paths[i].strokeCount);
 				bgfx::setTexture(0, gl->s_tex, gl->th);
 				bgfx::submit(gl->m_viewId, gl->prog);
 			}
@@ -677,7 +677,7 @@ namespace
 			bgfx::setState(gl->state
 				| BGFX_STATE_PT_TRISTRIP
 				);
-			bgfx::setVertexBuffer(&gl->tvb, paths[i].strokeOffset, paths[i].strokeCount);
+			bgfx::setVertexBuffer(0, &gl->tvb, paths[i].strokeOffset, paths[i].strokeCount);
 			bgfx::setTexture(0, gl->s_tex, gl->th);
 			bgfx::submit(gl->m_viewId, gl->prog);
 		}
@@ -690,7 +690,7 @@ namespace
 			nvgRenderSetUniforms(gl, call->uniformOffset, call->image);
 
 			bgfx::setState(gl->state);
-			bgfx::setVertexBuffer(&gl->tvb, call->vertexOffset, call->vertexCount);
+			bgfx::setVertexBuffer(0, &gl->tvb, call->vertexOffset, call->vertexCount);
 			bgfx::setTexture(0, gl->s_tex, gl->th);
 			bgfx::submit(gl->m_viewId, gl->prog);
 		}

+ 1 - 1
examples/common/ps/particle_system.cpp

@@ -655,7 +655,7 @@ namespace ps
 						| BGFX_STATE_CULL_CW
 						| BGFX_STATE_BLEND_NORMAL
 						);
-					bgfx::setVertexBuffer(&tvb);
+					bgfx::setVertexBuffer(0, &tvb);
 					bgfx::setIndexBuffer(&tib);
 					bgfx::setTexture(0, s_texColor, m_texture);
 					bgfx::submit(_view, m_particleProgram);

+ 28 - 6
include/bgfx/bgfx.h

@@ -2415,32 +2415,47 @@ namespace bgfx
 
 	/// Set vertex buffer for draw primitive.
 	///
+	/// @param[in] _stream Vertex stream.
 	/// @param[in] _handle Vertex buffer.
 	///
 	/// @attention C99 equivalent is `bgfx_set_vertex_buffer`.
 	///
-	void setVertexBuffer(VertexBufferHandle _handle);
+	void setVertexBuffer(
+		  uint8_t _stream
+		, VertexBufferHandle _handle
+		);
 
 	/// Set vertex buffer for draw primitive.
 	///
+	/// @param[in] _stream Vertex stream.
 	/// @param[in] _handle Vertex buffer.
 	/// @param[in] _startVertex First vertex to render.
 	/// @param[in] _numVertices Number of vertices to render.
 	///
 	/// @attention C99 equivalent is `bgfx_set_vertex_buffer`.
 	///
-	void setVertexBuffer(VertexBufferHandle _handle, uint32_t _startVertex, uint32_t _numVertices);
+	void setVertexBuffer(
+		  uint8_t _stream
+		, VertexBufferHandle _handle
+		, uint32_t _startVertex
+		, uint32_t _numVertices
+		);
 
 	/// Set vertex buffer for draw primitive.
 	///
+	/// @param[in] _stream Vertex stream.
 	/// @param[in] _handle Dynamic vertex buffer.
 	///
 	/// @attention C99 equivalent is `bgfx_set_dynamic_vertex_buffer`.
 	///
-	void setVertexBuffer(DynamicVertexBufferHandle _handle);
+	void setVertexBuffer(
+		  uint8_t _stream
+		, DynamicVertexBufferHandle _handle
+		);
 
 	/// Set vertex buffer for draw primitive.
 	///
+	/// @param[in] _stream Vertex stream.
 	/// @param[in] _handle Dynamic vertex buffer.
 	/// @param[in] _startVertex First vertex to render.
 	/// @param[in] _numVertices Number of vertices to render.
@@ -2448,21 +2463,27 @@ namespace bgfx
 	/// @attention C99 equivalent is `bgfx_set_dynamic_vertex_buffer`.
 	///
 	void setVertexBuffer(
-		  DynamicVertexBufferHandle _handle
+		  uint8_t _stream
+		, DynamicVertexBufferHandle _handle
 		, uint32_t _startVertex
 		, uint32_t _numVertices
 		);
 
 	/// Set vertex buffer for draw primitive.
 	///
+	/// @param[in] _stream Vertex stream.
 	/// @param[in] _tvb Transient vertex buffer.
 	///
 	/// @attention C99 equivalent is `bgfx_set_transient_vertex_buffer`.
 	///
-	void setVertexBuffer(const TransientVertexBuffer* _tvb);
+	void setVertexBuffer(
+		  uint8_t _stream
+		, const TransientVertexBuffer* _tvb
+		);
 
 	/// Set vertex buffer for draw primitive.
 	///
+	/// @param[in] _stream Vertex stream.
 	/// @param[in] _tvb Transient vertex buffer.
 	/// @param[in] _startVertex First vertex to render.
 	/// @param[in] _numVertices Number of vertices to render.
@@ -2470,7 +2491,8 @@ namespace bgfx
 	/// @attention C99 equivalent is `bgfx_set_transient_vertex_buffer`.
 	///
 	void setVertexBuffer(
-		  const TransientVertexBuffer* _tvb
+		  uint8_t _stream
+		, const TransientVertexBuffer* _tvb
 		, uint32_t _startVertex
 		, uint32_t _numVertices
 		);

+ 3 - 3
include/bgfx/c99/bgfx.h

@@ -840,13 +840,13 @@ BGFX_C_API void bgfx_set_dynamic_index_buffer(bgfx_dynamic_index_buffer_handle_t
 BGFX_C_API void bgfx_set_transient_index_buffer(const bgfx_transient_index_buffer_t* _tib, uint32_t _firstIndex, uint32_t _numIndices);
 
 /**/
-BGFX_C_API void bgfx_set_vertex_buffer(bgfx_vertex_buffer_handle_t _handle, uint32_t _startVertex, uint32_t _numVertices);
+BGFX_C_API void bgfx_set_vertex_buffer(uint8_t _stream, bgfx_vertex_buffer_handle_t _handle, uint32_t _startVertex, uint32_t _numVertices);
 
 /**/
-BGFX_C_API void bgfx_set_dynamic_vertex_buffer(bgfx_dynamic_vertex_buffer_handle_t _handle, uint32_t _startVertex, uint32_t _numVertices);
+BGFX_C_API void bgfx_set_dynamic_vertex_buffer(uint8_t _stream, bgfx_dynamic_vertex_buffer_handle_t _handle, uint32_t _startVertex, uint32_t _numVertices);
 
 /**/
-BGFX_C_API void bgfx_set_transient_vertex_buffer(const bgfx_transient_vertex_buffer_t* _tvb, uint32_t _startVertex, uint32_t _numVertices);
+BGFX_C_API void bgfx_set_transient_vertex_buffer(uint8_t _stream, const bgfx_transient_vertex_buffer_t* _tvb, uint32_t _startVertex, uint32_t _numVertices);
 
 /**/
 BGFX_C_API void bgfx_set_instance_data_buffer(const bgfx_instance_data_buffer_t* _idb, uint32_t _num);

+ 3 - 3
include/bgfx/c99/platform.h

@@ -175,9 +175,9 @@ typedef struct bgfx_interface_vtbl
     void (*set_index_buffer)(bgfx_index_buffer_handle_t _handle, uint32_t _firstIndex, uint32_t _numIndices);
     void (*set_dynamic_index_buffer)(bgfx_dynamic_index_buffer_handle_t _handle, uint32_t _firstIndex, uint32_t _numIndices);
     void (*set_transient_index_buffer)(const bgfx_transient_index_buffer_t* _tib, uint32_t _firstIndex, uint32_t _numIndices);
-    void (*set_vertex_buffer)(bgfx_vertex_buffer_handle_t _handle, uint32_t _startVertex, uint32_t _numVertices);
-    void (*set_dynamic_vertex_buffer)(bgfx_dynamic_vertex_buffer_handle_t _handle, uint32_t _startVertex, uint32_t _numVertices);
-    void (*set_transient_vertex_buffer)(const bgfx_transient_vertex_buffer_t* _tvb, uint32_t _startVertex, uint32_t _numVertices);
+    void (*set_vertex_buffer)(uint8_t _stream, bgfx_vertex_buffer_handle_t _handle, uint32_t _startVertex, uint32_t _numVertices);
+    void (*set_dynamic_vertex_buffer)(uint8_t _stream, bgfx_dynamic_vertex_buffer_handle_t _handle, uint32_t _startVertex, uint32_t _numVertices);
+    void (*set_transient_vertex_buffer)(uint8_t _stream, const bgfx_transient_vertex_buffer_t* _tvb, uint32_t _startVertex, uint32_t _numVertices);
     void (*set_instance_data_buffer)(const bgfx_instance_data_buffer_t* _idb, uint32_t _num);
     void (*set_instance_data_from_vertex_buffer)(bgfx_vertex_buffer_handle_t _handle, uint32_t _startVertex, uint32_t _num);
     void (*set_instance_data_from_dynamic_vertex_buffer)(bgfx_dynamic_vertex_buffer_handle_t _handle, uint32_t _startVertex, uint32_t _num);

+ 1 - 1
include/bgfx/defines.h

@@ -6,7 +6,7 @@
 #ifndef BGFX_DEFINES_H_HEADER_GUARD
 #define BGFX_DEFINES_H_HEADER_GUARD
 
-#define BGFX_API_VERSION UINT32_C(40)
+#define BGFX_API_VERSION UINT32_C(41)
 
 ///
 #define BGFX_STATE_RGB_WRITE               UINT64_C(0x0000000000000001) //!< Enable RGB write.

+ 12 - 27
src/bgfx.cpp

@@ -3741,14 +3741,9 @@ error:
 		s_ctx->setVertexBuffer(_stream, _handle, _startVertex, _numVertices);
 	}
 
-	void setVertexBuffer(VertexBufferHandle _handle)
+	void setVertexBuffer(uint8_t _stream, VertexBufferHandle _handle)
 	{
-		setVertexBuffer(0, _handle, 0, UINT32_MAX);
-	}
-
-	void setVertexBuffer(VertexBufferHandle _handle, uint32_t _startVertex, uint32_t _numVertices)
-	{
-		setVertexBuffer(0, _handle, _startVertex, _numVertices);
+		setVertexBuffer(_stream, _handle, 0, UINT32_MAX);
 	}
 
 	void setVertexBuffer(uint8_t _stream, DynamicVertexBufferHandle _handle, uint32_t _startVertex, uint32_t _numVertices)
@@ -3757,14 +3752,9 @@ error:
 		s_ctx->setVertexBuffer(_stream, _handle, _startVertex, _numVertices);
 	}
 
-	void setVertexBuffer(DynamicVertexBufferHandle _handle)
+	void setVertexBuffer(uint8_t _stream, DynamicVertexBufferHandle _handle)
 	{
-		setVertexBuffer(0, _handle, 0, UINT32_MAX);
-	}
-
-	void setVertexBuffer(DynamicVertexBufferHandle _handle, uint32_t _startVertex, uint32_t _numVertices)
-	{
-		setVertexBuffer(0, _handle, _startVertex, _numVertices);
+		setVertexBuffer(_stream, _handle, 0, UINT32_MAX);
 	}
 
 	void setVertexBuffer(uint8_t _stream, const TransientVertexBuffer* _tvb, uint32_t _startVertex, uint32_t _numVertices)
@@ -3774,14 +3764,9 @@ error:
 		s_ctx->setVertexBuffer(_stream, _tvb, _startVertex, _numVertices);
 	}
 
-	void setVertexBuffer(const TransientVertexBuffer* _tvb)
-	{
-		setVertexBuffer(0, _tvb, 0, UINT32_MAX);
-	}
-
-	void setVertexBuffer(const TransientVertexBuffer* _tvb, uint32_t _startVertex, uint32_t _numVertices)
+	void setVertexBuffer(uint8_t _stream, const TransientVertexBuffer* _tvb)
 	{
-		setVertexBuffer(0, _tvb, _startVertex, _numVertices);
+		setVertexBuffer(_stream, _tvb, 0, UINT32_MAX);
 	}
 
 	void setInstanceDataBuffer(const InstanceDataBuffer* _idb, uint32_t _num)
@@ -4805,21 +4790,21 @@ BGFX_C_API void bgfx_set_transient_index_buffer(const bgfx_transient_index_buffe
 	bgfx::setIndexBuffer( (const bgfx::TransientIndexBuffer*)_tib, _firstIndex, _numIndices);
 }
 
-BGFX_C_API void bgfx_set_vertex_buffer(bgfx_vertex_buffer_handle_t _handle, uint32_t _startVertex, uint32_t _numVertices)
+BGFX_C_API void bgfx_set_vertex_buffer(uint8_t _stream, bgfx_vertex_buffer_handle_t _handle, uint32_t _startVertex, uint32_t _numVertices)
 {
 	union { bgfx_vertex_buffer_handle_t c; bgfx::VertexBufferHandle cpp; } handle = { _handle };
-	bgfx::setVertexBuffer(handle.cpp, _startVertex, _numVertices);
+	bgfx::setVertexBuffer(_stream, handle.cpp, _startVertex, _numVertices);
 }
 
-BGFX_C_API void bgfx_set_dynamic_vertex_buffer(bgfx_dynamic_vertex_buffer_handle_t _handle, uint32_t _startVertex, uint32_t _numVertices)
+BGFX_C_API void bgfx_set_dynamic_vertex_buffer(uint8_t _stream, bgfx_dynamic_vertex_buffer_handle_t _handle, uint32_t _startVertex, uint32_t _numVertices)
 {
 	union { bgfx_dynamic_vertex_buffer_handle_t c; bgfx::DynamicVertexBufferHandle cpp; } handle = { _handle };
-	bgfx::setVertexBuffer(handle.cpp, _startVertex, _numVertices);
+	bgfx::setVertexBuffer(_stream, handle.cpp, _startVertex, _numVertices);
 }
 
-BGFX_C_API void bgfx_set_transient_vertex_buffer(const bgfx_transient_vertex_buffer_t* _tvb, uint32_t _startVertex, uint32_t _numVertices)
+BGFX_C_API void bgfx_set_transient_vertex_buffer(uint8_t _stream, const bgfx_transient_vertex_buffer_t* _tvb, uint32_t _startVertex, uint32_t _numVertices)
 {
-	bgfx::setVertexBuffer( (const bgfx::TransientVertexBuffer*)_tvb, _startVertex, _numVertices);
+	bgfx::setVertexBuffer(_stream, (const bgfx::TransientVertexBuffer*)_tvb, _startVertex, _numVertices);
 }
 
 BGFX_C_API void bgfx_set_instance_data_buffer(const bgfx_instance_data_buffer_t* _idb, uint32_t _num)

+ 1 - 1
tools/texturev/texturev.cpp

@@ -457,7 +457,7 @@ bool screenQuad(int32_t _x, int32_t _y, int32_t _width, uint32_t _height, uint32
 		vertex[4].m_abgr = _abgr;
 		vertex[5].m_abgr = _abgr;
 
-		bgfx::setVertexBuffer(&vb);
+		bgfx::setVertexBuffer(0, &vb);
 
 		return true;
 	}