Selaa lähdekoodia

Detect corrupted shader.

Branimir Karadžić 8 vuotta sitten
vanhempi
sitoutus
372a26882b
1 muutettua tiedostoa jossa 57 lisäystä ja 52 poistoa
  1. 57 52
      src/bgfx_p.h

+ 57 - 52
src/bgfx_p.h

@@ -3402,9 +3402,9 @@ namespace bgfx
 
 			if (!err.isOk() )
 			{
-				ShaderHandle invalid = BGFX_INVALID_HANDLE;
+				BX_TRACE("Couldn't read shader signature!");
 				release(_mem);
-				return invalid;
+				return BGFX_INVALID_HANDLE;
 			}
 
 			if (BGFX_CHUNK_MAGIC_CSH != magic
@@ -3417,9 +3417,8 @@ namespace bgfx
 					, ( (uint8_t*)&magic)[2]
 					, ( (uint8_t*)&magic)[3]
 					);
-				ShaderHandle invalid = BGFX_INVALID_HANDLE;
 				release(_mem);
-				return invalid;
+				return BGFX_INVALID_HANDLE;
 			}
 
 			const uint32_t shaderHash = bx::hash<bx::HashMurmur2A>(_mem->data, _mem->size);
@@ -3432,74 +3431,80 @@ namespace bgfx
 				return handle;
 			}
 
-			ShaderHandle handle = { m_shaderHandle.alloc() };
+			uint32_t iohash;
+			bx::read(&reader, iohash, &err);
 
-			BX_WARN(isValid(handle), "Failed to allocate shader handle.");
-			if (isValid(handle) )
+			uint16_t count;
+			bx::read(&reader, count, &err);
+
+			if (!err.isOk() )
 			{
-				bool ok = m_shaderHashMap.insert(shaderHash, handle.idx);
-				BX_CHECK(ok, "Shader already exists!"); BX_UNUSED(ok);
+				BX_TRACE("Corrupted shader binary!");
+				release(_mem);
+				return BGFX_INVALID_HANDLE;
+			}
 
-				uint32_t iohash;
-				bx::read(&reader, iohash);
+			ShaderHandle handle = { m_shaderHandle.alloc() };
 
-				uint16_t count;
-				bx::read(&reader, count);
+			if (!isValid(handle) )
+			{
+				BX_TRACE("Failed to allocate shader handle.");
+				release(_mem);
+				return BGFX_INVALID_HANDLE;
+			}
 
-				ShaderRef& sr = m_shaderRef[handle.idx];
-				sr.m_refCount = 1;
-				sr.m_hash     = iohash;
-				sr.m_num      = 0;
-				sr.m_uniforms = NULL;
+			bool ok = m_shaderHashMap.insert(shaderHash, handle.idx);
+			BX_CHECK(ok, "Shader already exists!"); BX_UNUSED(ok);
 
-				UniformHandle* uniforms = (UniformHandle*)alloca(count*sizeof(UniformHandle) );
+			ShaderRef& sr = m_shaderRef[handle.idx];
+			sr.m_refCount = 1;
+			sr.m_hash     = iohash;
+			sr.m_num      = 0;
+			sr.m_uniforms = NULL;
 
-				for (uint32_t ii = 0; ii < count; ++ii)
-				{
-					uint8_t nameSize = 0;
-					bx::read(&reader, nameSize);
+			UniformHandle* uniforms = (UniformHandle*)alloca(count*sizeof(UniformHandle) );
 
-					char name[256];
-					bx::read(&reader, &name, nameSize);
-					name[nameSize] = '\0';
+			for (uint32_t ii = 0; ii < count; ++ii)
+			{
+				uint8_t nameSize = 0;
+				bx::read(&reader, nameSize, &err);
 
-					uint8_t type = 0;
-					bx::read(&reader, type);
-					type &= ~BGFX_UNIFORM_MASK;
+				char name[256];
+				bx::read(&reader, &name, nameSize, &err);
+				name[nameSize] = '\0';
 
-					uint8_t num;
-					bx::read(&reader, num);
+				uint8_t type = 0;
+				bx::read(&reader, type, &err);
+				type &= ~BGFX_UNIFORM_MASK;
 
-					uint16_t regIndex;
-					bx::read(&reader, regIndex);
+				uint8_t num;
+				bx::read(&reader, num, &err);
 
-					uint16_t regCount;
-					bx::read(&reader, regCount);
+				uint16_t regIndex;
+				bx::read(&reader, regIndex, &err);
 
-					PredefinedUniform::Enum predefined = nameToPredefinedUniformEnum(name);
-					if (PredefinedUniform::Count == predefined)
-					{
-						uniforms[sr.m_num] = createUniform(name, UniformType::Enum(type), regCount);
-						sr.m_num++;
-					}
-				}
+				uint16_t regCount;
+				bx::read(&reader, regCount, &err);
 
-				if (0 != sr.m_num)
+				PredefinedUniform::Enum predefined = nameToPredefinedUniformEnum(name);
+				if (PredefinedUniform::Count == predefined)
 				{
-					uint32_t size = sr.m_num*sizeof(UniformHandle);
-					sr.m_uniforms = (UniformHandle*)BX_ALLOC(g_allocator, size);
-					bx::memCopy(sr.m_uniforms, uniforms, size);
+					uniforms[sr.m_num] = createUniform(name, UniformType::Enum(type), regCount);
+					sr.m_num++;
 				}
-
-				CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateShader);
-				cmdbuf.write(handle);
-				cmdbuf.write(_mem);
 			}
-			else
+
+			if (0 != sr.m_num)
 			{
-				release(_mem);
+				uint32_t size = sr.m_num*sizeof(UniformHandle);
+				sr.m_uniforms = (UniformHandle*)BX_ALLOC(g_allocator, size);
+				bx::memCopy(sr.m_uniforms, uniforms, size);
 			}
 
+			CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateShader);
+			cmdbuf.write(handle);
+			cmdbuf.write(_mem);
+
 			return handle;
 		}