|
|
@@ -132,15 +132,11 @@ namespace bgfx
|
|
|
|
|
|
#define BGFX_CHUNK_MAGIC_TEX BX_MAKEFOURCC('T', 'E', 'X', 0x0)
|
|
|
|
|
|
-#define BGFX_CHUNK_MAGIC_CSH BX_MAKEFOURCC('C', 'S', 'H', 0x3)
|
|
|
-#define BGFX_CHUNK_MAGIC_FSH BX_MAKEFOURCC('F', 'S', 'H', 0x5)
|
|
|
-#define BGFX_CHUNK_MAGIC_VSH BX_MAKEFOURCC('V', 'S', 'H', 0x5)
|
|
|
-
|
|
|
#define BGFX_CLEAR_COLOR_USE_PALETTE UINT16_C(0x8000)
|
|
|
-#define BGFX_CLEAR_MASK (0 \
|
|
|
- | BGFX_CLEAR_COLOR \
|
|
|
- | BGFX_CLEAR_DEPTH \
|
|
|
- | BGFX_CLEAR_STENCIL \
|
|
|
+#define BGFX_CLEAR_MASK (0 \
|
|
|
+ | BGFX_CLEAR_COLOR \
|
|
|
+ | BGFX_CLEAR_DEPTH \
|
|
|
+ | BGFX_CLEAR_STENCIL \
|
|
|
| BGFX_CLEAR_COLOR_USE_PALETTE \
|
|
|
)
|
|
|
|
|
|
@@ -319,6 +315,25 @@ namespace bgfx
|
|
|
|
|
|
bool windowsVersionIs(Condition::Enum _op, uint32_t _version);
|
|
|
|
|
|
+ constexpr bool isShaderType(uint32_t _magic, char _type)
|
|
|
+ {
|
|
|
+ return uint32_t(_type) == (_magic & BX_MAKEFOURCC(0xff, 0, 0, 0) );
|
|
|
+ }
|
|
|
+
|
|
|
+ inline bool isShaderBin(uint32_t _magic)
|
|
|
+ {
|
|
|
+ return BX_MAKEFOURCC(0, 'S', 'H', 0) == (_magic & BX_MAKEFOURCC(0, 0xff, 0xff, 0) )
|
|
|
+ && (isShaderType(_magic, 'C') || isShaderType(_magic, 'F') || isShaderType(_magic, 'V') )
|
|
|
+ ;
|
|
|
+ }
|
|
|
+
|
|
|
+ inline bool isShaderVerLess(uint32_t _magic, uint8_t _version)
|
|
|
+ {
|
|
|
+ return (_magic & BX_MAKEFOURCC(0, 0, 0, 0xff) ) < BX_MAKEFOURCC(0, 0, 0, _version);
|
|
|
+ }
|
|
|
+
|
|
|
+ const char* getShaderTypeName(uint32_t _magic);
|
|
|
+
|
|
|
struct Clear
|
|
|
{
|
|
|
void set(uint16_t _flags, uint32_t _rgba, float _depth, uint8_t _stencil)
|
|
|
@@ -3526,11 +3541,9 @@ namespace bgfx
|
|
|
return BGFX_INVALID_HANDLE;
|
|
|
}
|
|
|
|
|
|
- if (BGFX_CHUNK_MAGIC_CSH != magic
|
|
|
- && BGFX_CHUNK_MAGIC_FSH != magic
|
|
|
- && BGFX_CHUNK_MAGIC_VSH != magic)
|
|
|
+ if (!isShaderBin(magic) )
|
|
|
{
|
|
|
- BX_WARN(false, "Invalid shader signature! %c%c%c%d."
|
|
|
+ BX_TRACE("Invalid shader signature! %c%c%c%d."
|
|
|
, ( (uint8_t*)&magic)[0]
|
|
|
, ( (uint8_t*)&magic)[1]
|
|
|
, ( (uint8_t*)&magic)[2]
|
|
|
@@ -3540,6 +3553,23 @@ namespace bgfx
|
|
|
return BGFX_INVALID_HANDLE;
|
|
|
}
|
|
|
|
|
|
+ if (isShaderType(magic, 'C')
|
|
|
+ && 0 == (g_caps.supported & BGFX_CAPS_COMPUTE) )
|
|
|
+ {
|
|
|
+ BX_TRACE("Creating compute shader but compute is not supported!");
|
|
|
+ release(_mem);
|
|
|
+ return BGFX_INVALID_HANDLE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( (isShaderType(magic, 'C') && isShaderVerLess(magic, 3) )
|
|
|
+ || (isShaderType(magic, 'F') && isShaderVerLess(magic, 5) )
|
|
|
+ || (isShaderType(magic, 'V') && isShaderVerLess(magic, 5) ) )
|
|
|
+ {
|
|
|
+ BX_TRACE("Unsupported shader binary version.");
|
|
|
+ release(_mem);
|
|
|
+ return BGFX_INVALID_HANDLE;
|
|
|
+ }
|
|
|
+
|
|
|
const uint32_t shaderHash = bx::hash<bx::HashMurmur2A>(_mem->data, _mem->size);
|
|
|
const uint16_t idx = m_shaderHashMap.find(shaderHash);
|
|
|
if (kInvalidHandle != idx)
|
|
|
@@ -3550,8 +3580,19 @@ namespace bgfx
|
|
|
return handle;
|
|
|
}
|
|
|
|
|
|
- uint32_t iohash;
|
|
|
- bx::read(&reader, iohash, &err);
|
|
|
+ uint32_t hashIn;
|
|
|
+ bx::read(&reader, hashIn, &err);
|
|
|
+
|
|
|
+ uint32_t hashOut;
|
|
|
+
|
|
|
+ if (isShaderVerLess(magic, 6) )
|
|
|
+ {
|
|
|
+ hashOut = hashIn;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ bx::read(&reader, hashOut, &err);
|
|
|
+ }
|
|
|
|
|
|
uint16_t count;
|
|
|
bx::read(&reader, count, &err);
|
|
|
@@ -3577,7 +3618,8 @@ namespace bgfx
|
|
|
|
|
|
ShaderRef& sr = m_shaderRef[handle.idx];
|
|
|
sr.m_refCount = 1;
|
|
|
- sr.m_hash = iohash;
|
|
|
+ sr.m_hashIn = hashIn;
|
|
|
+ sr.m_hashOut = hashOut;
|
|
|
sr.m_num = 0;
|
|
|
sr.m_uniforms = NULL;
|
|
|
|
|
|
@@ -3745,7 +3787,7 @@ namespace bgfx
|
|
|
{
|
|
|
const ShaderRef& vsr = m_shaderRef[_vsh.idx];
|
|
|
const ShaderRef& fsr = m_shaderRef[_fsh.idx];
|
|
|
- if (vsr.m_hash != fsr.m_hash)
|
|
|
+ if (vsr.m_hashOut != fsr.m_hashIn)
|
|
|
{
|
|
|
BX_TRACE("Vertex shader output doesn't match fragment shader input.");
|
|
|
return BGFX_INVALID_HANDLE;
|
|
|
@@ -4682,7 +4724,8 @@ namespace bgfx
|
|
|
{
|
|
|
UniformHandle* m_uniforms;
|
|
|
String m_name;
|
|
|
- uint32_t m_hash;
|
|
|
+ uint32_t m_hashIn;
|
|
|
+ uint32_t m_hashOut;
|
|
|
int16_t m_refCount;
|
|
|
uint16_t m_num;
|
|
|
};
|