1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2024-12-12 22:08:59 +01:00

[dxvk] Remove interpolation decorations for replaced shader inputs

This commit is contained in:
Philip Rebohle 2022-05-06 16:10:47 +02:00
parent 6d3ba1b7d7
commit 5d0273f520
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
3 changed files with 40 additions and 12 deletions

View File

@ -318,16 +318,37 @@ namespace dxvk {
} }
} }
// Remove location declarations // Remove location and other declarations
for (auto ins : code) { for (auto iter = code.begin(); iter != code.end(); ) {
if (ins.opCode() == spv::OpDecorate auto ins = *(iter++);
&& ins.arg(2) == spv::DecorationLocation
&& ins.arg(1) == inputVarId) { if (ins.opCode() == spv::OpDecorate && ins.arg(1) == inputVarId) {
code.beginInsertion(ins.offset()); uint32_t numWords;
code.erase(4);
code.endInsertion(); switch (ins.arg(2)) {
case spv::DecorationLocation:
case spv::DecorationFlat:
case spv::DecorationNoPerspective:
case spv::DecorationCentroid:
case spv::DecorationPatch:
case spv::DecorationSample:
numWords = ins.length();
break; break;
default:
numWords = 0;
} }
if (numWords) {
code.beginInsertion(ins.offset());
code.erase(numWords);
iter = SpirvInstructionIterator(code.data(), code.endInsertion(), code.dwords());
}
}
if (ins.opCode() == spv::OpFunction)
break;
} }
// Fix up pointer types used in access chain instructions // Fix up pointer types used in access chain instructions

View File

@ -208,9 +208,10 @@ namespace dxvk {
* After this call, new instructions will be * After this call, new instructions will be
* appended to the stream. In other words, * appended to the stream. In other words,
* this will restore default behaviour. * this will restore default behaviour.
* \returns Previous instruction pointer
*/ */
void endInsertion() { size_t endInsertion() {
m_ptr = m_code.size(); return std::exchange(m_ptr, m_code.size());
} }
private: private:

View File

@ -109,7 +109,7 @@ namespace dxvk {
: m_code (length != 0 ? code : nullptr), : m_code (length != 0 ? code : nullptr),
m_offset(length != 0 ? offset : 0), m_offset(length != 0 ? offset : 0),
m_length(length) { m_length(length) {
if ((length >= 5) && (m_code[0] == spv::MagicNumber)) if ((length >= 5) && (offset == 0) && (m_code[0] == spv::MagicNumber))
this->advance(5); this->advance(5);
} }
@ -118,6 +118,12 @@ namespace dxvk {
return *this; return *this;
} }
SpirvInstructionIterator operator ++ (int) {
SpirvInstructionIterator result = *this;
this->advance(SpirvInstruction(m_code, m_offset, m_length).length());
return result;
}
SpirvInstruction operator * () const { SpirvInstruction operator * () const {
return SpirvInstruction(m_code, m_offset, m_length); return SpirvInstruction(m_code, m_offset, m_length);
} }