gl_shader_decompiler: Avoid writing output attribute when unimplemented

This commit is contained in:
ReinUsesLisp 2019-09-06 15:02:12 -03:00
parent 4ee9949639
commit 17a9b0178d
1 changed files with 14 additions and 10 deletions

View File

@ -984,10 +984,10 @@ private:
return {std::move(temporary), value.GetType()}; return {std::move(temporary), value.GetType()};
} }
Expression GetOutputAttribute(const AbufNode* abuf) { std::optional<Expression> GetOutputAttribute(const AbufNode* abuf) {
switch (const auto attribute = abuf->GetIndex()) { switch (const auto attribute = abuf->GetIndex()) {
case Attribute::Index::Position: case Attribute::Index::Position:
return {"gl_Position"s + GetSwizzle(abuf->GetElement()), Type::Float}; return {{"gl_Position"s + GetSwizzle(abuf->GetElement()), Type::Float}};
case Attribute::Index::LayerViewportPointSize: case Attribute::Index::LayerViewportPointSize:
switch (abuf->GetElement()) { switch (abuf->GetElement()) {
case 0: case 0:
@ -997,25 +997,25 @@ private:
if (IsVertexShader(stage) && !device.HasVertexViewportLayer()) { if (IsVertexShader(stage) && !device.HasVertexViewportLayer()) {
return {}; return {};
} }
return {"gl_Layer", Type::Int}; return {{"gl_Layer", Type::Int}};
case 2: case 2:
if (IsVertexShader(stage) && !device.HasVertexViewportLayer()) { if (IsVertexShader(stage) && !device.HasVertexViewportLayer()) {
return {}; return {};
} }
return {"gl_ViewportIndex", Type::Int}; return {{"gl_ViewportIndex", Type::Int}};
case 3: case 3:
UNIMPLEMENTED_MSG("Requires some state changes for gl_PointSize to work in shader"); UNIMPLEMENTED_MSG("Requires some state changes for gl_PointSize to work in shader");
return {"gl_PointSize", Type::Float}; return {{"gl_PointSize", Type::Float}};
} }
return {}; return {};
case Attribute::Index::ClipDistances0123: case Attribute::Index::ClipDistances0123:
return {fmt::format("gl_ClipDistance[{}]", abuf->GetElement()), Type::Float}; return {{fmt::format("gl_ClipDistance[{}]", abuf->GetElement()), Type::Float}};
case Attribute::Index::ClipDistances4567: case Attribute::Index::ClipDistances4567:
return {fmt::format("gl_ClipDistance[{}]", abuf->GetElement() + 4), Type::Float}; return {{fmt::format("gl_ClipDistance[{}]", abuf->GetElement() + 4), Type::Float}};
default: default:
if (IsGenericAttribute(attribute)) { if (IsGenericAttribute(attribute)) {
return {GetOutputAttribute(attribute) + GetSwizzle(abuf->GetElement()), return {
Type::Float}; {GetOutputAttribute(attribute) + GetSwizzle(abuf->GetElement()), Type::Float}};
} }
UNIMPLEMENTED_MSG("Unhandled output attribute: {}", static_cast<u32>(attribute)); UNIMPLEMENTED_MSG("Unhandled output attribute: {}", static_cast<u32>(attribute));
return {}; return {};
@ -1187,7 +1187,11 @@ private:
target = {GetRegister(gpr->GetIndex()), Type::Float}; target = {GetRegister(gpr->GetIndex()), Type::Float};
} else if (const auto abuf = std::get_if<AbufNode>(&*dest)) { } else if (const auto abuf = std::get_if<AbufNode>(&*dest)) {
UNIMPLEMENTED_IF(abuf->IsPhysicalBuffer()); UNIMPLEMENTED_IF(abuf->IsPhysicalBuffer());
target = GetOutputAttribute(abuf); auto output = GetOutputAttribute(abuf);
if (!output) {
return {};
}
target = std::move(*output);
} else if (const auto lmem = std::get_if<LmemNode>(&*dest)) { } else if (const auto lmem = std::get_if<LmemNode>(&*dest)) {
if (stage == ProgramType::Compute) { if (stage == ProgramType::Compute) {
LOG_WARNING(Render_OpenGL, "Local memory is stubbed on compute shaders"); LOG_WARNING(Render_OpenGL, "Local memory is stubbed on compute shaders");