From 07ef25fec5e8f0b095f8fb13ec8b197fcad29541 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 31 May 2018 22:13:08 +0200 Subject: [PATCH] [dxbc] Parse OSG5 chunk for Shader Model 5 geometry shaders --- src/dxbc/dxbc_chunk_isgn.cpp | 5 +++-- src/dxbc/dxbc_chunk_isgn.h | 3 ++- src/dxbc/dxbc_module.cpp | 10 +++------- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/dxbc/dxbc_chunk_isgn.cpp b/src/dxbc/dxbc_chunk_isgn.cpp index 3fa36eb6..bbe5e0d4 100644 --- a/src/dxbc/dxbc_chunk_isgn.cpp +++ b/src/dxbc/dxbc_chunk_isgn.cpp @@ -2,7 +2,7 @@ namespace dxvk { - DxbcIsgn::DxbcIsgn(DxbcReader reader) { + DxbcIsgn::DxbcIsgn(DxbcReader reader, DxbcTag tag) { uint32_t elementCount = reader.readu32(); reader.skip(sizeof(uint32_t)); @@ -13,13 +13,14 @@ namespace dxvk { for (uint32_t i = 0; i < elementCount; i++) { DxbcSgnEntry entry; + entry.streamId = tag == "OSG5" ? reader.readu32() : 0; entry.semanticName = reader.clone(reader.readu32()).readString(); entry.semanticIndex = reader.readu32(); entry.systemValue = static_cast(reader.readu32()); entry.componentType = componentTypes.at(reader.readu32()); entry.registerId = reader.readu32(); entry.componentMask = bit::extract(reader.readu32(), 0, 3); - + m_entries.push_back(entry); } } diff --git a/src/dxbc/dxbc_chunk_isgn.h b/src/dxbc/dxbc_chunk_isgn.h index 31c84975..39ddc8cc 100644 --- a/src/dxbc/dxbc_chunk_isgn.h +++ b/src/dxbc/dxbc_chunk_isgn.h @@ -22,6 +22,7 @@ namespace dxvk { DxbcRegMask componentMask; DxbcScalarType componentType; DxbcSystemValue systemValue; + uint32_t streamId; }; /** @@ -34,7 +35,7 @@ namespace dxvk { public: - DxbcIsgn(DxbcReader reader); + DxbcIsgn(DxbcReader reader, DxbcTag tag); ~DxbcIsgn(); auto begin() const { return m_entries.cbegin(); } diff --git a/src/dxbc/dxbc_module.cpp b/src/dxbc/dxbc_module.cpp index 6b51227a..5b0824d1 100644 --- a/src/dxbc/dxbc_module.cpp +++ b/src/dxbc/dxbc_module.cpp @@ -24,14 +24,10 @@ namespace dxvk { m_shexChunk = new DxbcShex(chunkReader); if ((tag == "ISGN")) - m_isgnChunk = new DxbcIsgn(chunkReader); - - if ((tag == "OSGN")) - m_osgnChunk = new DxbcIsgn(chunkReader); - -// if ((tag == "OSG5")) -// m_osgnChunk = new DxbcIsgn(chunkReader); + m_isgnChunk = new DxbcIsgn(chunkReader, tag); + if ((tag == "OSGN") || (tag == "OSG5")) + m_osgnChunk = new DxbcIsgn(chunkReader, tag); } }