Working HECL shader generation on D3D11/12

This commit is contained in:
Jack Andersen 2015-11-17 20:16:08 -10:00
parent 05f3854449
commit 6387b420ae
9 changed files with 79 additions and 15 deletions

2
hecl/extern/Athena vendored

@ -1 +1 @@
Subproject commit df43b72f8ac860c6662896cd97498a4091a6174d Subproject commit 18e94dbc54cf1e88d7c5b697e96b05a1f583edee

2
hecl/extern/libBoo vendored

@ -1 +1 @@
Subproject commit 742e062cf2f128baeb9533cd7fd41f4acb072001 Subproject commit b97ad76c45b4965f3dd9f499e5975738714f5fa8

View File

@ -351,7 +351,9 @@ struct GX : IBackend
} }
} }
for (int i=0 ; i<3 ; ++i) /* Allocate from back for compatibility with Retro's
* extended shader arithmetic use */
for (int i=2 ; i>=0 ; --i)
if (!(regMask & (1 << i))) if (!(regMask & (1 << i)))
return i; return i;
@ -379,7 +381,9 @@ struct GX : IBackend
} }
} }
for (int i=0 ; i<3 ; ++i) /* Allocate from back for compatibility with Retro's
* extended shader arithmetic use */
for (int i=2 ; i>=0 ; --i)
if (!(regMask & (1 << i))) if (!(regMask & (1 << i)))
return i; return i;

View File

@ -10,6 +10,8 @@
namespace HECL namespace HECL
{ {
struct HMDLMeta;
namespace Runtime namespace Runtime
{ {
@ -75,6 +77,9 @@ public:
bool getDepthWrite() const {return m_depthWrite;} bool getDepthWrite() const {return m_depthWrite;}
bool getBackfaceCulling() const {return m_backfaceCulling;} bool getBackfaceCulling() const {return m_backfaceCulling;}
uint64_t getMetaData() const {return m_meta;} uint64_t getMetaData() const {return m_meta;}
/* For shader constructors that require vertex format up-front (HLSL) */
boo::IVertexFormat* newVertexFormat(boo::IGraphicsDataFactory* factory) const;
}; };
/** /**
@ -217,11 +222,15 @@ struct HMDLData
{ {
boo::IGraphicsBufferS* m_vbo; boo::IGraphicsBufferS* m_vbo;
boo::IGraphicsBufferS* m_ibo; boo::IGraphicsBufferS* m_ibo;
boo::IVertexFormat* m_vtxFmt; boo::IVertexFormat* m_vtxFmt = nullptr;
HMDLData(boo::IGraphicsDataFactory* factory, HMDLData(boo::IGraphicsDataFactory* factory,
const void* metaData, const void* vbo, const void* ibo); const void* metaData, const void* vbo, const void* ibo);
/* For binding constructors that require vertex format up front (GLSL) */
static boo::IVertexFormat* NewVertexFormat(boo::IGraphicsDataFactory* factory, const HMDLMeta& meta,
boo::IGraphicsBuffer* vbo=nullptr, boo::IGraphicsBuffer* ibo=nullptr);
boo::IShaderDataBinding* newShaderDataBindng(boo::IGraphicsDataFactory* factory, boo::IShaderDataBinding* newShaderDataBindng(boo::IGraphicsDataFactory* factory,
boo::IShaderPipeline* shader, boo::IShaderPipeline* shader,
size_t ubufCount, boo::IGraphicsBuffer** ubufs, size_t ubufCount, boo::IGraphicsBuffer** ubufs,

View File

@ -1,4 +1,5 @@
add_library(HECLBackend add_library(HECLBackend
GX.cpp GX.cpp
ProgrammableCommon.cpp ProgrammableCommon.cpp
GLSL.cpp) GLSL.cpp
HLSL.cpp)

View File

@ -21,6 +21,7 @@ add_library(HECLCommon
../include/HECL/Backend/GX.hpp ../include/HECL/Backend/GX.hpp
../include/HECL/Backend/ProgrammableCommon.hpp ../include/HECL/Backend/ProgrammableCommon.hpp
../include/HECL/Backend/GLSL.hpp ../include/HECL/Backend/GLSL.hpp
../include/HECL/Backend/HLSL.hpp
../include/HECL/Frontend.hpp ../include/HECL/Frontend.hpp
../include/HECL/Database.hpp ../include/HECL/Database.hpp
../include/HECL/Runtime.hpp ../include/HECL/Runtime.hpp

View File

@ -10,17 +10,17 @@ namespace Frontend
void Parser::skipWhitespace(std::string::const_iterator& it) void Parser::skipWhitespace(std::string::const_iterator& it)
{ {
while (true) while (it != m_source->cend())
{ {
while (isspace(*it) && it != m_source->cend()) while (it != m_source->cend() && isspace(*it))
++it; ++it;
/* Skip comment line */ /* Skip comment line */
if (*it == '#') if (it != m_source->cend() && *it == '#')
{ {
while (*it != '\n' && it != m_source->cend()) while (it != m_source->cend() && *it != '\n')
++it; ++it;
if (*it == '\n') if (it != m_source->cend() && *it == '\n')
++it; ++it;
continue; continue;
} }

View File

@ -22,12 +22,20 @@ HMDLData::HMDLData(boo::IGraphicsDataFactory* factory,
m_vbo = factory->newStaticBuffer(boo::BufferUseVertex, vbo, meta.vertStride, meta.vertCount); m_vbo = factory->newStaticBuffer(boo::BufferUseVertex, vbo, meta.vertStride, meta.vertCount);
m_ibo = factory->newStaticBuffer(boo::BufferUseIndex, ibo, 4, meta.indexCount); m_ibo = factory->newStaticBuffer(boo::BufferUseIndex, ibo, 4, meta.indexCount);
if (factory->bindingNeedsVertexFormat())
m_vtxFmt = NewVertexFormat(factory, meta, m_vbo, m_ibo);
}
/* For binding constructors that require vertex format up front (GLSL) */
boo::IVertexFormat* HMDLData::NewVertexFormat(boo::IGraphicsDataFactory* factory, const HMDLMeta& meta,
boo::IGraphicsBuffer* vbo, boo::IGraphicsBuffer* ibo)
{
size_t elemCount = 2 + meta.colorCount + meta.uvCount + meta.weightCount; size_t elemCount = 2 + meta.colorCount + meta.uvCount + meta.weightCount;
std::unique_ptr<boo::VertexElementDescriptor[]> vdescs(new boo::VertexElementDescriptor[elemCount]); std::unique_ptr<boo::VertexElementDescriptor[]> vdescs(new boo::VertexElementDescriptor[elemCount]);
for (size_t i=0 ; i<elemCount ; ++i) for (size_t i=0 ; i<elemCount ; ++i)
{ {
vdescs[i].vertBuffer = m_vbo; vdescs[i].vertBuffer = vbo;
vdescs[i].indexBuffer = m_ibo; vdescs[i].indexBuffer = ibo;
} }
vdescs[0].semantic = boo::VertexSemanticPosition; vdescs[0].semantic = boo::VertexSemanticPosition;
@ -52,7 +60,43 @@ HMDLData::HMDLData(boo::IGraphicsDataFactory* factory,
vdescs[e].semanticIdx = i; vdescs[e].semanticIdx = i;
} }
m_vtxFmt = factory->newVertexFormat(elemCount, vdescs.get()); return factory->newVertexFormat(elemCount, vdescs.get());
}
/* For shader constructors that require vertex format up-front (HLSL) */
boo::IVertexFormat* ShaderTag::newVertexFormat(boo::IGraphicsDataFactory *factory) const
{
size_t elemCount = 2 + m_colorCount + m_uvCount + m_weightCount;
std::unique_ptr<boo::VertexElementDescriptor[]> vdescs(new boo::VertexElementDescriptor[elemCount]);
for (size_t i=0 ; i<elemCount ; ++i)
{
vdescs[i].vertBuffer = nullptr;
vdescs[i].indexBuffer = nullptr;
}
vdescs[0].semantic = boo::VertexSemanticPosition;
vdescs[1].semantic = boo::VertexSemanticNormal;
size_t e = 2;
for (size_t i=0 ; i<m_colorCount ; ++i, ++e)
{
vdescs[e].semantic = boo::VertexSemanticColor;
vdescs[e].semanticIdx = i;
}
for (size_t i=0 ; i<m_uvCount ; ++i, ++e)
{
vdescs[e].semantic = boo::VertexSemanticUV;
vdescs[e].semanticIdx = i;
}
for (size_t i=0 ; i<m_weightCount ; ++i, ++e)
{
vdescs[e].semantic = boo::VertexSemanticWeight;
vdescs[e].semanticIdx = i;
}
return factory->newVertexFormat(elemCount, vdescs.get());
} }
} }

View File

@ -12,6 +12,7 @@ namespace HECL
namespace Runtime namespace Runtime
{ {
IShaderBackendFactory* _NewGLSLBackendFactory(boo::IGraphicsDataFactory* gfxFactory); IShaderBackendFactory* _NewGLSLBackendFactory(boo::IGraphicsDataFactory* gfxFactory);
IShaderBackendFactory* _NewHLSLBackendFactory(boo::IGraphicsDataFactory* gfxFactory);
static LogVisor::LogModule Log("ShaderCacheManager"); static LogVisor::LogModule Log("ShaderCacheManager");
static uint64_t IDX_MAGIC = SBig(uint64_t(0xDEADFEEDC001D00D)); static uint64_t IDX_MAGIC = SBig(uint64_t(0xDEADFEEDC001D00D));
@ -109,8 +110,12 @@ ShaderCacheManager::ShaderCacheManager(const FileStoreManager& storeMgr,
case boo::IGraphicsDataFactory::PlatformOGL: case boo::IGraphicsDataFactory::PlatformOGL:
m_factory.reset(_NewGLSLBackendFactory(gfxFactory)); m_factory.reset(_NewGLSLBackendFactory(gfxFactory));
break; break;
case boo::IGraphicsDataFactory::PlatformD3D11:
case boo::IGraphicsDataFactory::PlatformD3D12:
m_factory.reset(_NewHLSLBackendFactory(gfxFactory));
break;
default: default:
Log.report(LogVisor::FatalError, "unsupported backend %s", gfxFactory->platformName()); Log.report(LogVisor::FatalError, _S("unsupported backend %s"), gfxFactory->platformName());
} }
reload(); reload();