diff --git a/src/spirv/spirv_code_buffer.cpp b/src/spirv/spirv_code_buffer.cpp index 300bbf86..7cc3b434 100644 --- a/src/spirv/spirv_code_buffer.cpp +++ b/src/spirv/spirv_code_buffer.cpp @@ -109,7 +109,7 @@ namespace dxvk { void SpirvCodeBuffer::putHeader(uint32_t boundIds) { this->putWord(spv::MagicNumber); - this->putWord(0x00010000); // v1.0 + this->putWord(0x00010300); // v1.3 this->putWord(0); // Generator this->putWord(boundIds); this->putWord(0); // Schema diff --git a/src/spirv/spirv_module.cpp b/src/spirv/spirv_module.cpp index bea4f538..e9a58395 100644 --- a/src/spirv/spirv_module.cpp +++ b/src/spirv/spirv_module.cpp @@ -2872,6 +2872,28 @@ namespace dxvk { } + uint32_t SpirvModule::opGroupNonUniformLogicalAnd( + uint32_t resultType, + uint32_t execution, + uint32_t operation, + uint32_t value, + uint32_t clusterSize) { + uint32_t resultId = this->allocateId(); + + m_code.putIns(spv::OpGroupNonUniformLogicalAnd, + 6 + (clusterSize ? 1 : 0)); + m_code.putWord(resultType); + m_code.putWord(resultId); + m_code.putWord(execution); + m_code.putWord(operation); + m_code.putWord(value); + + if (clusterSize) + m_code.putWord(clusterSize); + return resultId; + } + + void SpirvModule::opControlBarrier( uint32_t execution, uint32_t memory, diff --git a/src/spirv/spirv_module.h b/src/spirv/spirv_module.h index 22fc76ea..4789054e 100644 --- a/src/spirv/spirv_module.h +++ b/src/spirv/spirv_module.h @@ -991,6 +991,13 @@ namespace dxvk { uint32_t coordinates, uint32_t reference, const SpirvImageOperands& operands); + + uint32_t opGroupNonUniformLogicalAnd( + uint32_t resultType, + uint32_t execution, + uint32_t operation, + uint32_t value, + uint32_t clusterSize); void opControlBarrier( uint32_t execution,