Skip to content

Commit a9157eb

Browse files
committed
shader_recompiler: Only forward declared number of vertex inputs.
1 parent d1643d1 commit a9157eb

5 files changed

Lines changed: 22 additions & 10 deletions

File tree

src/shader_recompiler/backend/spirv/emit_spirv_quad_rect.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ using Sirit::Id;
1212
constexpr u32 SPIRV_VERSION_1_5 = 0x00010500;
1313

1414
struct QuadRectListEmitter : public Sirit::Module {
15-
explicit QuadRectListEmitter(const FragmentRuntimeInfo& fs_info_)
16-
: Sirit::Module{SPIRV_VERSION_1_5}, fs_info{fs_info_} {
15+
explicit QuadRectListEmitter(const VertexRuntimeInfo& vs_info_, const FragmentRuntimeInfo& fs_info_)
16+
: Sirit::Module{SPIRV_VERSION_1_5}, vs_info{vs_info_}, fs_info{fs_info_} {
1717
void_id = TypeVoid();
1818
bool_id = TypeBool();
1919
float_id = TypeFloat(32);
@@ -252,8 +252,9 @@ struct QuadRectListEmitter : public Sirit::Module {
252252
} else {
253253
gl_per_vertex = AddOutput(gl_per_vertex_type);
254254
}
255-
outputs.reserve(fs_info.num_inputs);
256-
for (int i = 0; i < fs_info.num_inputs; i++) {
255+
const auto num_forwards = std::min(vs_info.num_exports, fs_info.num_inputs);
256+
outputs.reserve(num_forwards);
257+
for (int i = 0; i < num_forwards; i++) {
257258
const auto& input = fs_info.inputs[i];
258259
if (input.IsDefault()) {
259260
continue;
@@ -276,8 +277,10 @@ struct QuadRectListEmitter : public Sirit::Module {
276277
const Id gl_per_vertex_array{TypeArray(gl_per_vertex_type, Constant(uint_id, 32U))};
277278
gl_in = AddInput(gl_per_vertex_array);
278279
const Id float_arr{TypeArray(vec4_id, Int(32))};
279-
inputs.reserve(fs_info.num_inputs);
280-
for (int i = 0; i < fs_info.num_inputs; i++) {
280+
281+
const auto num_forwards = std::min(vs_info.num_exports, fs_info.num_inputs);
282+
inputs.reserve(num_forwards);
283+
for (int i = 0; i < num_forwards; i++) {
281284
const auto& input = fs_info.inputs[i];
282285
if (input.IsDefault()) {
283286
continue;
@@ -288,6 +291,7 @@ struct QuadRectListEmitter : public Sirit::Module {
288291
}
289292

290293
private:
294+
VertexRuntimeInfo vs_info;
291295
FragmentRuntimeInfo fs_info;
292296
Id main;
293297
Id void_id;
@@ -319,8 +323,10 @@ struct QuadRectListEmitter : public Sirit::Module {
319323
std::vector<Id> interfaces;
320324
};
321325

322-
std::vector<u32> EmitAuxilaryTessShader(AuxShaderType type, const FragmentRuntimeInfo& fs_info) {
323-
QuadRectListEmitter ctx{fs_info};
326+
std::vector<u32> EmitAuxilaryTessShader(AuxShaderType type,
327+
const VertexRuntimeInfo& vs_info,
328+
const FragmentRuntimeInfo& fs_info) {
329+
QuadRectListEmitter ctx{vs_info, fs_info};
324330
switch (type) {
325331
case AuxShaderType::RectListTCS:
326332
ctx.EmitRectListTCS();

src/shader_recompiler/backend/spirv/emit_spirv_quad_rect.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
namespace Shader {
1010
struct FragmentRuntimeInfo;
11+
struct VertexRuntimeInfo;
1112
}
1213

1314
namespace Shader::Backend::SPIRV {
@@ -19,6 +20,7 @@ enum class AuxShaderType : u32 {
1920
};
2021

2122
[[nodiscard]] std::vector<u32> EmitAuxilaryTessShader(AuxShaderType type,
23+
const VertexRuntimeInfo& vs_info,
2224
const FragmentRuntimeInfo& fs_info);
2325

2426
} // namespace Shader::Backend::SPIRV

src/shader_recompiler/runtime_info.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ using OutputMap = std::array<Output, 4>;
8181

8282
struct VertexRuntimeInfo {
8383
u32 num_outputs;
84+
u32 num_exports;
8485
std::array<OutputMap, 3> outputs;
8586
bool tess_emulated_primitive{};
8687
bool emulate_depth_negative_one_to_one{};

src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,9 @@ GraphicsPipeline::GraphicsPipeline(
202202
} else if (is_rect_list || is_quad_list) {
203203
const auto type = is_quad_list ? AuxShaderType::QuadListTCS : AuxShaderType::RectListTCS;
204204
if (!preloading) {
205+
const auto& vs_info = runtime_infos[u32(Shader::LogicalStage::Vertex)].vs_info;
205206
const auto& fs_info = runtime_infos[u32(Shader::LogicalStage::Fragment)].fs_info;
206-
sdata.tcs = Shader::Backend::SPIRV::EmitAuxilaryTessShader(type, fs_info);
207+
sdata.tcs = Shader::Backend::SPIRV::EmitAuxilaryTessShader(type, vs_info, fs_info);
207208
}
208209
shader_stages.emplace_back(vk::PipelineShaderStageCreateInfo{
209210
.stage = vk::ShaderStageFlagBits::eTessellationControl,
@@ -220,9 +221,10 @@ GraphicsPipeline::GraphicsPipeline(
220221
});
221222
} else if (is_rect_list || is_quad_list) {
222223
if (!preloading) {
224+
const auto& vs_info = runtime_infos[u32(Shader::LogicalStage::Vertex)].vs_info;
223225
const auto& fs_info = runtime_infos[u32(Shader::LogicalStage::Fragment)].fs_info;
224226
sdata.tes = Shader::Backend::SPIRV::EmitAuxilaryTessShader(
225-
AuxShaderType::PassthroughTES, fs_info);
227+
AuxShaderType::PassthroughTES, vs_info, fs_info);
226228
}
227229
shader_stages.emplace_back(vk::PipelineShaderStageCreateInfo{
228230
.stage = vk::ShaderStageFlagBits::eTessellationEvaluation,

src/video_core/renderer_vulkan/vk_pipeline_cache.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ const Shader::RuntimeInfo& PipelineCache::BuildRuntimeInfo(Stage stage, LogicalS
127127
info.vs_info.step_rate_0 = regs.vgt_instance_step_rate_0;
128128
info.vs_info.step_rate_1 = regs.vgt_instance_step_rate_1;
129129
info.vs_info.num_outputs = MapOutputs(info.vs_info.outputs, regs.vs_output_control);
130+
info.vs_info.num_exports = regs.vs_output_config.NumExports();
130131
info.vs_info.emulate_depth_negative_one_to_one =
131132
!instance.IsDepthClipControlSupported() &&
132133
regs.clipper_control.clip_space == AmdGpu::ClipSpace::MinusWToW;

0 commit comments

Comments
 (0)