mirror of https://github.com/AxioDL/metaforce.git
aurora: Work around build_bind_groups race condition
This commit is contained in:
parent
71342ed75e
commit
44a4d667b7
|
@ -356,7 +356,8 @@ ShaderInfo populate_pipeline_config(PipelineConfig& config, GX::Primitive primit
|
|||
// TODO separate shader info from build_shader for async
|
||||
{
|
||||
std::lock_guard lk{g_pipelineMutex};
|
||||
const auto [_, info] = build_shader(config.shaderConfig);
|
||||
auto [_, info] = build_shader(config.shaderConfig);
|
||||
info.bindGroups = build_bind_groups(info); // TODO this is hack
|
||||
return info;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -91,8 +91,19 @@ struct PipelineConfig {
|
|||
std::optional<float> dstAlpha;
|
||||
bool depthCompare, depthUpdate, alphaUpdate;
|
||||
};
|
||||
struct GXBindGroupLayouts {
|
||||
wgpu::BindGroupLayout uniformLayout;
|
||||
wgpu::BindGroupLayout samplerLayout;
|
||||
wgpu::BindGroupLayout textureLayout;
|
||||
};
|
||||
struct GXBindGroups {
|
||||
BindGroupRef uniformBindGroup;
|
||||
BindGroupRef samplerBindGroup;
|
||||
BindGroupRef textureBindGroup;
|
||||
};
|
||||
// Output info from shader generation
|
||||
struct ShaderInfo {
|
||||
GXBindGroups bindGroups;
|
||||
std::bitset<maxTextures> sampledTextures;
|
||||
std::bitset<4> sampledKcolors;
|
||||
std::bitset<2> sampledColorChannels;
|
||||
|
@ -105,20 +116,8 @@ wgpu::RenderPipeline build_pipeline(const PipelineConfig& config, const ShaderIn
|
|||
ArrayRef<wgpu::VertexBufferLayout> vtxBuffers, wgpu::ShaderModule shader,
|
||||
zstring_view label) noexcept;
|
||||
std::pair<wgpu::ShaderModule, ShaderInfo> build_shader(const ShaderConfig& config) noexcept;
|
||||
|
||||
// Range build_vertex_buffer(const GXShaderInfo& info) noexcept;
|
||||
Range build_uniform(const ShaderInfo& info) noexcept;
|
||||
|
||||
struct GXBindGroupLayouts {
|
||||
wgpu::BindGroupLayout uniformLayout;
|
||||
wgpu::BindGroupLayout samplerLayout;
|
||||
wgpu::BindGroupLayout textureLayout;
|
||||
};
|
||||
struct GXBindGroups {
|
||||
BindGroupRef uniformBindGroup;
|
||||
BindGroupRef samplerBindGroup;
|
||||
BindGroupRef textureBindGroup;
|
||||
};
|
||||
GXBindGroupLayouts build_bind_group_layouts(const ShaderInfo& info) noexcept;
|
||||
GXBindGroups build_bind_groups(const ShaderInfo& info) noexcept;
|
||||
} // namespace aurora::gfx::gx
|
||||
|
|
|
@ -513,7 +513,7 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> {{
|
|||
auto shader = gpu::g_device.CreateShaderModule(&shaderDescriptor);
|
||||
|
||||
info.uniformSize = align_uniform(info.uniformSize);
|
||||
const auto pair = std::make_pair(std::move(shader), info);
|
||||
auto pair = std::make_pair(std::move(shader), info);
|
||||
g_gxCachedShaders.emplace(hash, pair);
|
||||
|
||||
return pair;
|
||||
|
|
|
@ -67,7 +67,7 @@ void stream_end() noexcept {
|
|||
.vertRange = vertRange,
|
||||
.uniformRange = build_uniform(info),
|
||||
.vertexCount = sStreamState->vertexCount,
|
||||
.bindGroups = build_bind_groups(info),
|
||||
.bindGroups = info.bindGroups,
|
||||
});
|
||||
|
||||
sStreamState.reset();
|
||||
|
|
Loading…
Reference in New Issue