Browse Source

Added ability to set marker for profiling events.

bkaradzic 12 years ago
parent
commit
1f4539ec7c
7 changed files with 83 additions and 56 deletions
  1. 3 0
      include/bgfx.h
  2. 16 7
      src/bgfx.cpp
  3. 35 49
      src/bgfx_p.h
  4. 10 0
      src/renderer_d3d11.cpp
  5. 10 0
      src/renderer_d3d9.cpp
  6. 5 0
      src/renderer_gl.cpp
  7. 4 0
      src/renderer_null.cpp

+ 3 - 0
include/bgfx.h

@@ -777,6 +777,9 @@ namespace bgfx
 	/// Set view view and projection matrices for multiple views.
 	void setViewTransformMask(uint32_t _viewMask, const void* _view, const void* _proj, uint8_t _other = 0xff);
 
+	/// Sets debug marker.
+	void setMarker(const char* _marker);
+
 	/// Set render states for draw primitive.
 	///
 	/// @param _state State flags. Default state for primitive type is

+ 16 - 7
src/bgfx.cpp

@@ -670,7 +670,7 @@ namespace bgfx
 		return s_ctx.renderFrame();
 	}
 
-	const uint32_t g_uniformTypeSize[UniformType::Count] =
+	const uint32_t g_uniformTypeSize[UniformType::Count+1] =
 	{
 		sizeof(int32_t),
 		sizeof(float),
@@ -682,6 +682,7 @@ namespace bgfx
 		4*sizeof(float),
 		3*3*sizeof(float),
 		4*4*sizeof(float),
+		1,
 	};
 
 	void ConstantBuffer::writeUniform(UniformType::Enum _type, uint16_t _loc, const void* _value, uint16_t _num)
@@ -698,6 +699,14 @@ namespace bgfx
 		write(&_value, sizeof(void*) );
 	}
 
+	void ConstantBuffer::writeMarker(const char* _marker)
+	{
+		uint16_t num = (uint16_t)strlen(_marker)+1;
+		uint32_t opcode = encodeOpcode(bgfx::UniformType::Count, 0, num, true);
+		write(opcode);
+		write(_marker, num);
+	}
+
 	void Context::init(bool _createRenderThread)
 	{
 		BX_CHECK(!m_rendererInitialized, "Already initialized?");
@@ -1344,6 +1353,12 @@ namespace bgfx
 		s_ctx.setViewTransformMask(_viewMask, _view, _proj, _other);
 	}
 
+	void setMarker(const char* _marker)
+	{
+		BGFX_CHECK_MAIN_THREAD();
+		s_ctx.m_submit->setMarker(_marker);
+	}
+
 	void setState(uint64_t _state, uint32_t _rgba)
 	{
 		BGFX_CHECK_MAIN_THREAD();
@@ -1374,12 +1389,6 @@ namespace bgfx
 		s_ctx.setUniform(_handle, _value, _num);
 	}
 
-	void setUniform(ProgramHandle _program, UniformHandle _handle, const void* _value)
-	{
-		BGFX_CHECK_MAIN_THREAD();
-		s_ctx.setUniform(_program, _handle, _value);
-	}
-
 	void setIndexBuffer(IndexBufferHandle _handle, uint32_t _firstIndex, uint32_t _numIndices)
 	{
 		BGFX_CHECK_MAIN_THREAD();

+ 35 - 49
src/bgfx_p.h

@@ -191,7 +191,7 @@ namespace bgfx
 		const Memory* m_mem;
 	};
 
-	extern const uint32_t g_uniformTypeSize[UniformType::Count];
+	extern const uint32_t g_uniformTypeSize[UniformType::Count+1];
 	extern CallbackI* g_callback;
 	extern ReallocFn g_realloc;
 	extern FreeFn g_free;
@@ -653,16 +653,14 @@ namespace bgfx
 		uint16_t m_num;
 	};
 
-#define CONSTANT_OPCODE_MASK(_bits) ( (1<<_bits)-1)
-
-#define CONSTANT_OPCODE_TYPE_BITS 5
-#define CONSTANT_OPCODE_TYPE_MASK CONSTANT_OPCODE_MASK(CONSTANT_OPCODE_TYPE_BITS)
-#define CONSTANT_OPCODE_LOC_BITS 16
-#define CONSTANT_OPCODE_LOC_MASK CONSTANT_OPCODE_MASK(CONSTANT_OPCODE_LOC_BITS)
-#define CONSTANT_OPCODE_NUM_BITS 10
-#define CONSTANT_OPCODE_NUM_MASK CONSTANT_OPCODE_MASK(CONSTANT_OPCODE_NUM_BITS)
-#define CONSTANT_OPCODE_COPY_BITS 1
-#define CONSTANT_OPCODE_COPY_MASK CONSTANT_OPCODE_MASK(CONSTANT_OPCODE_COPY_BITS)
+#define CONSTANT_OPCODE_TYPE_SHIFT 27
+#define CONSTANT_OPCODE_TYPE_MASK  UINT32_C(0xf8000000)
+#define CONSTANT_OPCODE_LOC_SHIFT  11
+#define CONSTANT_OPCODE_LOC_MASK   UINT32_C(0x07fff800)
+#define CONSTANT_OPCODE_NUM_SHIFT  1
+#define CONSTANT_OPCODE_NUM_MASK   UINT32_C(0x000007fe)
+#define CONSTANT_OPCODE_COPY_SHIFT 0
+#define CONSTANT_OPCODE_COPY_MASK  UINT32_C(0x00000001)
 
 #define BGFX_UNIFORM_FRAGMENTBIT UINT8_C(0x10)
 
@@ -684,41 +682,21 @@ namespace bgfx
 
 		static uint32_t encodeOpcode(UniformType::Enum _type, uint16_t _loc, uint16_t _num, uint16_t _copy)
 		{
-			uint32_t opcode = 0;
-
-			opcode <<= CONSTANT_OPCODE_TYPE_BITS;
-			opcode |= _type&CONSTANT_OPCODE_TYPE_MASK;
-
-			opcode <<= CONSTANT_OPCODE_LOC_BITS;
-			opcode |= _loc&CONSTANT_OPCODE_LOC_MASK;
-
-			opcode <<= CONSTANT_OPCODE_NUM_BITS;
-			opcode |= _num&CONSTANT_OPCODE_NUM_MASK;
-
-			opcode <<= CONSTANT_OPCODE_COPY_BITS;
-			opcode |= _copy&CONSTANT_OPCODE_COPY_MASK;
-
-			return opcode;
+			const uint32_t type = _type << CONSTANT_OPCODE_TYPE_SHIFT;
+			const uint32_t loc  = _loc  << CONSTANT_OPCODE_LOC_SHIFT;
+			const uint32_t num  = _num  << CONSTANT_OPCODE_NUM_SHIFT;
+			const uint32_t copy = _copy << CONSTANT_OPCODE_COPY_SHIFT;
+			return type|loc|num|copy;
 		}
 
 		static void decodeOpcode(uint32_t _opcode, UniformType::Enum& _type, uint16_t& _loc, uint16_t& _num, uint16_t& _copy)
 		{
-			uint32_t copy;
-			uint32_t num;
-			uint32_t loc;
-
-			copy = _opcode&CONSTANT_OPCODE_COPY_MASK;
-			_opcode >>= CONSTANT_OPCODE_COPY_BITS;
-
-			num = _opcode&CONSTANT_OPCODE_NUM_MASK;
-			_opcode >>= CONSTANT_OPCODE_NUM_BITS;
-
-			loc = _opcode&CONSTANT_OPCODE_LOC_MASK;
-			_opcode >>= CONSTANT_OPCODE_LOC_BITS;
-
-			_type = (UniformType::Enum)(_opcode&CONSTANT_OPCODE_TYPE_MASK);
-			_opcode >>= CONSTANT_OPCODE_TYPE_BITS;
+			const uint32_t type = (_opcode&CONSTANT_OPCODE_TYPE_MASK) >> CONSTANT_OPCODE_TYPE_SHIFT;
+			const uint32_t loc  = (_opcode&CONSTANT_OPCODE_LOC_MASK)  >> CONSTANT_OPCODE_LOC_SHIFT;
+			const uint32_t num  = (_opcode&CONSTANT_OPCODE_NUM_MASK)  >> CONSTANT_OPCODE_NUM_SHIFT;
+			const uint32_t copy = (_opcode&CONSTANT_OPCODE_COPY_MASK) >> CONSTANT_OPCODE_COPY_SHIFT;
 
+			_type = (UniformType::Enum)(type);
 			_copy = (uint16_t)copy;
 			_num = (uint16_t)num;
 			_loc = (uint16_t)loc;
@@ -777,6 +755,7 @@ namespace bgfx
 
 		void writeUniform(UniformType::Enum _type, uint16_t _loc, const void* _value, uint16_t _num = 1);
 		void writeUniformRef(UniformType::Enum _type, uint16_t _loc, const void* _value, uint16_t _num = 1);
+		void writeMarker(const char* _marker);
 		void commit();
 
 	private:
@@ -996,6 +975,11 @@ namespace bgfx
 			}
 		}
 
+		void setMarker(const char* _name)
+		{
+			m_constantBuffer->writeMarker(_name);
+		}
+
 		void setState(uint64_t _state, uint32_t _rgba)
 		{
 			uint8_t blend = ( (_state&BGFX_STATE_BLEND_MASK)>>BGFX_STATE_BLEND_SHIFT)&0xff;
@@ -2194,11 +2178,6 @@ namespace bgfx
 			m_submit->writeConstant(uniform.m_type, _handle, _value, uint16_min(uniform.m_num, _num) );
 		}
 
-		void setUniform(ProgramHandle /*_program*/, UniformHandle /*_handle*/, const void* /*_value*/)
-		{
-			BX_CHECK(false, "NOT IMPLEMENTED!");
-		}
-
 		void setViewName(uint8_t _id, const char* _name)
 		{
 			CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::UpdateViewName);
@@ -2478,6 +2457,7 @@ namespace bgfx
 		void rendererSaveScreenShot(const char* _filePath);
 		void rendererUpdateViewName(uint8_t _id, const char* _name);
 		void rendererUpdateUniform(uint16_t _loc, const void* _data, uint32_t _size);
+		void rendererSetMarker(const char* _marker, uint32_t _size);
 
 		void rendererUpdateUniforms(ConstantBuffer* _constantBuffer, uint32_t _begin, uint32_t _end)
 		{
@@ -2497,10 +2477,16 @@ namespace bgfx
 				uint16_t copy;
 				ConstantBuffer::decodeOpcode(opcode, type, loc, num, copy);
 
-				const char* data;
 				uint32_t size = g_uniformTypeSize[type]*num;
-				data = _constantBuffer->read(size);
-				rendererUpdateUniform(loc, data, size);
+				const char* data = _constantBuffer->read(size);
+				if (UniformType::Count > type)
+				{
+					rendererUpdateUniform(loc, data, size);
+				}
+				else
+				{
+					rendererSetMarker(data, size);
+				}
 			}
 		}
 

+ 10 - 0
src/renderer_d3d11.cpp

@@ -2251,6 +2251,16 @@ namespace bgfx
 		memcpy(s_renderCtx.m_uniforms[_loc].m_data, _data, _size);
 	}
 
+	void Context::rendererSetMarker(const char* _marker, uint32_t _size)
+	{
+#if BGFX_CONFIG_DEBUG_PIX
+		uint32_t size = _size*sizeof(wchar_t);
+		wchar_t* name = (wchar_t*)alloca(size);
+		mbstowcs(name, _marker, size-2);
+		PIX_SETMARKER(D3DCOLOR_RGBA(0xff, 0xff, 0xff, 0xff), name);
+#endif // BGFX_CONFIG_DEBUG_PIX
+	}
+
 	void Context::rendererSubmit()
 	{
 		PIX_BEGINEVENT(D3DCOLOR_RGBA(0xff, 0x00, 0x00, 0xff), L"rendererSubmit");

+ 10 - 0
src/renderer_d3d9.cpp

@@ -2149,6 +2149,16 @@ namespace bgfx
 		memcpy(s_renderCtx.m_uniforms[_loc], _data, _size);
 	}
 
+	void Context::rendererSetMarker(const char* _marker, uint32_t _size)
+	{
+#if BGFX_CONFIG_DEBUG_PIX
+		uint32_t size = _size*sizeof(wchar_t);
+		wchar_t* name = (wchar_t*)alloca(size);
+		mbstowcs(name, _marker, size-2);
+		PIX_SETMARKER(D3DCOLOR_RGBA(0xff, 0xff, 0xff, 0xff), name);
+#endif // BGFX_CONFIG_DEBUG_PIX
+	}
+
 	void Context::rendererSubmit()
 	{
 		IDirect3DDevice9* device = s_renderCtx.m_device;

+ 5 - 0
src/renderer_gl.cpp

@@ -2595,6 +2595,11 @@ namespace bgfx
 		memcpy(s_renderCtx.m_uniforms[_loc], _data, _size);
 	}
 
+	void Context::rendererSetMarker(const char* _marker, uint32_t /*_size*/)
+	{
+		GREMEDY_SETMARKER(_marker);
+	}
+
 	void Context::rendererSubmit()
 	{
 		const GLuint defaultVao = s_renderCtx.m_vaoSupport;

+ 4 - 0
src/renderer_null.cpp

@@ -168,6 +168,10 @@ namespace bgfx
 	{
 	}
 
+	void Context::rendererSetMarker(const char* /*_marker*/, uint32_t /*_size*/)
+	{
+	}
+
 	void Context::rendererSubmit()
 	{
 	}