More reliable HLSL shader cache

This commit is contained in:
Jack Andersen 2016-08-08 08:53:31 -10:00
parent ca4d50c62b
commit 6740d6d00d
1 changed files with 17 additions and 3 deletions

View File

@ -373,10 +373,13 @@ struct HLSLBackendFactory : IShaderBackendFactory
boo::IGraphicsDataFactory::Context& ctx) boo::IGraphicsDataFactory::Context& ctx)
{ {
const ShaderTag& tag = data.m_tag; const ShaderTag& tag = data.m_tag;
athena::io::MemoryReader r(data.m_data.get(), data.m_sz); athena::io::MemoryReader r(data.m_data.get(), data.m_sz, false, false);
boo::BlendFactor blendSrc = boo::BlendFactor(r.readUByte()); boo::BlendFactor blendSrc = boo::BlendFactor(r.readUByte());
boo::BlendFactor blendDst = boo::BlendFactor(r.readUByte()); boo::BlendFactor blendDst = boo::BlendFactor(r.readUByte());
if (r.hasError())
return nullptr;
atUint32 vertSz = r.readUint32Big(); atUint32 vertSz = r.readUint32Big();
ComPtr<ID3DBlob> vertBlob; ComPtr<ID3DBlob> vertBlob;
if (vertSz) if (vertSz)
@ -401,6 +404,9 @@ struct HLSLBackendFactory : IShaderBackendFactory
r.readUBytesToBuf(pipelineBlob->GetBufferPointer(), pipelineSz); r.readUBytesToBuf(pipelineBlob->GetBufferPointer(), pipelineSz);
} }
if (r.hasError())
return nullptr;
boo::IShaderPipeline* ret = boo::IShaderPipeline* ret =
static_cast<boo::ID3DDataFactory::Context&>(ctx). static_cast<boo::ID3DDataFactory::Context&>(ctx).
newShaderPipeline(nullptr, nullptr, newShaderPipeline(nullptr, nullptr,
@ -499,16 +505,19 @@ struct HLSLBackendFactory : IShaderBackendFactory
return dataOut; return dataOut;
} }
void buildExtendedShaderFromCache(const ShaderCachedData& data, bool buildExtendedShaderFromCache(const ShaderCachedData& data,
const std::vector<ShaderCacheExtensions::ExtensionSlot>& extensionSlots, const std::vector<ShaderCacheExtensions::ExtensionSlot>& extensionSlots,
boo::IGraphicsDataFactory::Context& ctx, boo::IGraphicsDataFactory::Context& ctx,
FReturnExtensionShader returnFunc) FReturnExtensionShader returnFunc)
{ {
const ShaderTag& tag = data.m_tag; const ShaderTag& tag = data.m_tag;
athena::io::MemoryReader r(data.m_data.get(), data.m_sz); athena::io::MemoryReader r(data.m_data.get(), data.m_sz, false, false);
hecl::Backend::BlendFactor blendSrc = hecl::Backend::BlendFactor(r.readUByte()); hecl::Backend::BlendFactor blendSrc = hecl::Backend::BlendFactor(r.readUByte());
hecl::Backend::BlendFactor blendDst = hecl::Backend::BlendFactor(r.readUByte()); hecl::Backend::BlendFactor blendDst = hecl::Backend::BlendFactor(r.readUByte());
if (r.hasError())
return false;
for (const ShaderCacheExtensions::ExtensionSlot& slot : extensionSlots) for (const ShaderCacheExtensions::ExtensionSlot& slot : extensionSlots)
{ {
atUint32 vertSz = r.readUint32Big(); atUint32 vertSz = r.readUint32Big();
@ -535,6 +544,9 @@ struct HLSLBackendFactory : IShaderBackendFactory
r.readUBytesToBuf(pipelineBlob->GetBufferPointer(), pipelineSz); r.readUBytesToBuf(pipelineBlob->GetBufferPointer(), pipelineSz);
} }
if (r.hasError())
return false;
boo::IShaderPipeline* ret = boo::IShaderPipeline* ret =
static_cast<boo::ID3DDataFactory::Context&>(ctx). static_cast<boo::ID3DDataFactory::Context&>(ctx).
newShaderPipeline(nullptr, nullptr, newShaderPipeline(nullptr, nullptr,
@ -549,6 +561,8 @@ struct HLSLBackendFactory : IShaderBackendFactory
Log.report(logvisor::Fatal, "unable to build shader"); Log.report(logvisor::Fatal, "unable to build shader");
returnFunc(ret); returnFunc(ret);
} }
return true;
} }
}; };