diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index 57d0f98d..194d1164 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -547,13 +547,10 @@ namespace dxvk { result = this->selectOperandComponents(token, result, dstMask); // Apply source operand modifiers, if any - auto operandModifiers = operand.queryOperandExt( - DxbcOperandExt::OperandModifier); + DxbcOperandTokenExt token; - if (operandModifiers) { - result = this->applyOperandModifiers( - result, operandModifiers->data()); - } + if (operand.queryOperandExt(DxbcOperandExt::OperandModifier, token)) + result = this->applyOperandModifiers(result, token.data()); } return result; diff --git a/src/dxbc/dxbc_decoder.cpp b/src/dxbc/dxbc_decoder.cpp index 73980b05..2ea873c1 100644 --- a/src/dxbc/dxbc_decoder.cpp +++ b/src/dxbc/dxbc_decoder.cpp @@ -136,9 +136,9 @@ namespace dxvk { } - std::optional DxbcOperand::queryOperandExt(DxbcOperandExt ext) const { + bool DxbcOperand::queryOperandExt(DxbcOperandExt ext, DxbcOperandTokenExt& token) const { if (!this->token().isExtended()) - return { }; + return false; uint32_t extTokenId = 1; DxbcOperandTokenExt extToken; @@ -146,11 +146,13 @@ namespace dxvk { do { extToken = m_info.getWord(extTokenId++); - if (extToken.type() == ext) - return extToken; + if (extToken.type() == ext) { + token = extToken; + return true; + } } while (extToken.isExtended()); - return { }; + return false; } @@ -185,9 +187,9 @@ namespace dxvk { } - std::optional DxbcInstruction::queryOpcodeExt(DxbcExtOpcode extOpcode) const { + bool DxbcInstruction::queryOpcodeExt(DxbcExtOpcode extOpcode, DxbcOpcodeTokenExt& token) const { if (!this->token().isExtended()) - return { }; + return false; uint32_t extTokenId = 1; DxbcOpcodeTokenExt extToken; @@ -195,11 +197,13 @@ namespace dxvk { do { extToken = m_op.getWord(extTokenId++); - if (extToken.opcode() == extOpcode) - return extToken; + if (extToken.opcode() == extOpcode) { + token = extToken; + return true; + } } while (extToken.isExtended()); - return { }; + return false; } } \ No newline at end of file diff --git a/src/dxbc/dxbc_decoder.h b/src/dxbc/dxbc_decoder.h index c77edc66..7b02d467 100644 --- a/src/dxbc/dxbc_decoder.h +++ b/src/dxbc/dxbc_decoder.h @@ -1,7 +1,6 @@ #pragma once #include -#include #include "dxbc_enums.h" #include "dxbc_names.h" @@ -508,10 +507,12 @@ namespace dxvk { * If an extended operand token with the given * operand extension exists, return that token. * \param [in] ext The operand extension - * \returns The extended operand token + * \param [out] token The extended token + * \returns \c true if the token was defined */ - std::optional queryOperandExt( - DxbcOperandExt ext) const; + bool queryOperandExt( + DxbcOperandExt ext, + DxbcOperandTokenExt& token) const; /** * \brief Reads 32-bit immediate integer @@ -579,11 +580,13 @@ namespace dxvk { * * If an extended opcode token with the given * opcode exists, the token will be returned. - * \param extOpcode Extended opcode - * \returns Extended opcode token + * \param [in] extOpcode Extended opcode + * \param [out] token The extended token + * \returns \c true if the token was defined */ - std::optional queryOpcodeExt( - DxbcExtOpcode extOpcode) const; + bool queryOpcodeExt( + DxbcExtOpcode extOpcode, + DxbcOpcodeTokenExt& token) const; /** * \brief Retrieves argument word