mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-15 07:29:17 +01:00
[dxbc] Vertex inputs now respect attribute type
Fixes issues with integer attributes which were encountered in Nier: Automata.
This commit is contained in:
parent
21582b955a
commit
8c0e797f37
@ -30,6 +30,16 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const DxbcSgnEntry* DxbcIsgn::findByRegister(uint32_t registerId) const {
|
||||||
|
for (auto e = this->begin(); e != this->end(); e++) {
|
||||||
|
if (e->registerId == registerId)
|
||||||
|
return &(*e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const DxbcSgnEntry* DxbcIsgn::find(
|
const DxbcSgnEntry* DxbcIsgn::find(
|
||||||
const std::string& semanticName,
|
const std::string& semanticName,
|
||||||
uint32_t semanticIndex) const {
|
uint32_t semanticIndex) const {
|
||||||
|
@ -38,6 +38,9 @@ namespace dxvk {
|
|||||||
auto begin() const { return m_entries.cbegin(); }
|
auto begin() const { return m_entries.cbegin(); }
|
||||||
auto end () const { return m_entries.cend(); }
|
auto end () const { return m_entries.cend(); }
|
||||||
|
|
||||||
|
const DxbcSgnEntry* findByRegister(
|
||||||
|
uint32_t registerId) const;
|
||||||
|
|
||||||
const DxbcSgnEntry* find(
|
const DxbcSgnEntry* find(
|
||||||
const std::string& semanticName,
|
const std::string& semanticName,
|
||||||
uint32_t semanticIndex) const;
|
uint32_t semanticIndex) const;
|
||||||
|
@ -428,9 +428,11 @@ namespace dxvk {
|
|||||||
// This may happen when multiple system values are
|
// This may happen when multiple system values are
|
||||||
// mapped to different parts of the same register.
|
// mapped to different parts of the same register.
|
||||||
if (m_vRegs.at(regIdx) == 0 && sv == DxbcSystemValue::None) {
|
if (m_vRegs.at(regIdx) == 0 && sv == DxbcSystemValue::None) {
|
||||||
|
const DxbcVectorType regType = getInputRegType(regIdx);
|
||||||
|
|
||||||
DxbcRegisterInfo info;
|
DxbcRegisterInfo info;
|
||||||
info.type.ctype = DxbcScalarType::Float32;
|
info.type.ctype = regType.ctype;
|
||||||
info.type.ccount = 4;
|
info.type.ccount = regType.ccount;
|
||||||
info.type.alength = regDim;
|
info.type.alength = regDim;
|
||||||
info.sclass = spv::StorageClassInput;
|
info.sclass = spv::StorageClassInput;
|
||||||
|
|
||||||
@ -3424,7 +3426,9 @@ namespace dxvk {
|
|||||||
const uint32_t registerId = m_module.consti32(i);
|
const uint32_t registerId = m_module.consti32(i);
|
||||||
m_module.opStore(
|
m_module.opStore(
|
||||||
m_module.opAccessChain(ptrTypeId, m_vArray, 1, ®isterId),
|
m_module.opAccessChain(ptrTypeId, m_vArray, 1, ®isterId),
|
||||||
m_module.opLoad(vecTypeId, m_vRegs.at(i)));
|
m_module.opBitcast(vecTypeId, m_module.opLoad(
|
||||||
|
getVectorTypeId(getInputRegType(i)),
|
||||||
|
m_vRegs.at(i))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3471,9 +3475,10 @@ namespace dxvk {
|
|||||||
m_module.opStore(
|
m_module.opStore(
|
||||||
m_module.opAccessChain(dstPtrTypeId,
|
m_module.opAccessChain(dstPtrTypeId,
|
||||||
m_vArray, indices.size(), indices.data()),
|
m_vArray, indices.size(), indices.data()),
|
||||||
m_module.opLoad(vecTypeId,
|
m_module.opBitcast(vecTypeId, m_module.opLoad(
|
||||||
|
getVectorTypeId(getInputRegType(i)),
|
||||||
m_module.opAccessChain(srcPtrTypeId,
|
m_module.opAccessChain(srcPtrTypeId,
|
||||||
m_vRegs.at(i), 1, indices.data())));
|
m_vRegs.at(i), 1, indices.data()))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4014,6 +4019,23 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DxbcVectorType DxbcCompiler::getInputRegType(uint32_t regIdx) const {
|
||||||
|
DxbcVectorType result;
|
||||||
|
result.ctype = DxbcScalarType::Float32;
|
||||||
|
result.ccount = 4;
|
||||||
|
|
||||||
|
// Vertex shader inputs must match the type of the input layout
|
||||||
|
if (m_version.type() == DxbcProgramType::VertexShader) {
|
||||||
|
const DxbcSgnEntry* entry = m_isgn->findByRegister(regIdx);
|
||||||
|
|
||||||
|
if (entry != nullptr)
|
||||||
|
result.ctype = entry->componentType;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
uint32_t DxbcCompiler::getScalarTypeId(DxbcScalarType type) {
|
uint32_t DxbcCompiler::getScalarTypeId(DxbcScalarType type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case DxbcScalarType::Uint32: return m_module.defIntType(32, 0);
|
case DxbcScalarType::Uint32: return m_module.defIntType(32, 0);
|
||||||
|
@ -693,6 +693,9 @@ namespace dxvk {
|
|||||||
DxbcRegMask getTexCoordMask(
|
DxbcRegMask getTexCoordMask(
|
||||||
const DxbcImageInfo& imageType) const;
|
const DxbcImageInfo& imageType) const;
|
||||||
|
|
||||||
|
DxbcVectorType getInputRegType(
|
||||||
|
uint32_t regIdx) const;
|
||||||
|
|
||||||
///////////////////////////
|
///////////////////////////
|
||||||
// Type definition methods
|
// Type definition methods
|
||||||
uint32_t getScalarTypeId(
|
uint32_t getScalarTypeId(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user