gpu driver crash workarounds

This commit is contained in:
Turánszki János
2025-01-01 16:03:26 +01:00
parent 5aa4c1ce54
commit 0bf18892ef
2 changed files with 59 additions and 18 deletions
+58 -17
View File
@@ -198,6 +198,12 @@ Texture texture_weatherMap;
// See: https://github.com/turanszkij/WickedEngine/issues/450
GPUBuffer luminance_dummy;
// Dummy buffers preinitialized to invalid scene structs, avoids possible GPU crash when
// shader compiler is incorrectly pulling buffer desciptor load outside valid branch
GPUBuffer instance_dummy;
GPUBuffer geometry_dummy;
GPUBuffer material_dummy;
// Direct reference to a renderable instance:
struct RenderBatch
{
@@ -2124,6 +2130,45 @@ void LoadBuffers()
static_assert(LUMINANCE_BUFFER_OFFSET_EXPOSURE == 0);
}
{
ShaderMeshInstance data;
data.init();
GPUBufferDesc desc;
desc.stride = sizeof(data);
desc.size = desc.stride;
desc.bind_flags = BindFlag::SHADER_RESOURCE;
desc.misc_flags = ResourceMiscFlag::BUFFER_STRUCTURED;
device->CreateBuffer(&desc, &data, &instance_dummy);
device->SetName(&instance_dummy, "instance_dummy");
}
{
ShaderGeometry data;
data.init();
GPUBufferDesc desc;
desc.stride = sizeof(data);
desc.size = desc.stride;
desc.bind_flags = BindFlag::SHADER_RESOURCE;
desc.misc_flags = ResourceMiscFlag::BUFFER_STRUCTURED;
device->CreateBuffer(&desc, &data, &geometry_dummy);
device->SetName(&geometry_dummy, "geometry_dummy");
}
{
ShaderMaterial data;
data.init();
GPUBufferDesc desc;
desc.stride = sizeof(data);
desc.size = desc.stride;
desc.bind_flags = BindFlag::SHADER_RESOURCE;
desc.misc_flags = ResourceMiscFlag::BUFFER_STRUCTURED;
device->CreateBuffer(&desc, &data, &material_dummy);
device->SetName(&material_dummy, "material_dummy");
}
{
TextureDesc desc;
desc.type = TextureDesc::Type::TEXTURE_3D;
@@ -4593,6 +4638,19 @@ void UpdatePerFrameData(
frameCB.decals = ShaderEntityIterator(decalarray_offset, decalarray_count);
frameCB.forces = ShaderEntityIterator(forcefieldarray_offset, forcefieldarray_count);
// GPU crash workarounds, setting buffers with invalid data:
if (frameCB.scene.instancebuffer < 0)
{
frameCB.scene.instancebuffer = device->GetDescriptorIndex(&instance_dummy, SubresourceType::SRV);
}
if (frameCB.scene.geometrybuffer < 0)
{
frameCB.scene.geometrybuffer = device->GetDescriptorIndex(&geometry_dummy, SubresourceType::SRV);
}
if (frameCB.scene.materialbuffer < 0)
{
frameCB.scene.materialbuffer = device->GetDescriptorIndex(&material_dummy, SubresourceType::SRV);
}
}
void UpdateRenderData(
const Visibility& vis,
@@ -16189,23 +16247,7 @@ void Postprocess_VolumetricClouds_Upsample(
device->BindResource(&res.texture_reproject[temporal_output], 0, cmd);
device->BindResource(&res.texture_reproject_depth[temporal_output], 1, cmd);
{
GPUBarrier barriers[] = {
GPUBarrier::Image(&res.texture_reproject[temporal_output], res.texture_reproject[temporal_output].desc.layout, ResourceState::SHADER_RESOURCE),
GPUBarrier::Image(&res.texture_reproject_depth[temporal_output], res.texture_reproject_depth[temporal_output].desc.layout, ResourceState::SHADER_RESOURCE),
};
device->Barrier(barriers, arraysize(barriers), cmd);
}
device->Draw(3, 0, cmd);
{
GPUBarrier barriers[] = {
GPUBarrier::Image(&res.texture_reproject[temporal_output], ResourceState::SHADER_RESOURCE, res.texture_reproject[temporal_output].desc.layout),
GPUBarrier::Image(&res.texture_reproject_depth[temporal_output], ResourceState::SHADER_RESOURCE, res.texture_reproject_depth[temporal_output].desc.layout),
};
device->Barrier(barriers, arraysize(barriers), cmd);
}
}
wi::profiler::EndRange(range);
@@ -16351,7 +16393,6 @@ void Postprocess_TemporalAA(
{
GPUBarrier barriers[] = {
GPUBarrier::Memory(),
GPUBarrier::Image(output, ResourceState::UNORDERED_ACCESS, output->GetDesc().layout),
};
device->Barrier(barriers, arraysize(barriers), cmd);
+1 -1
View File
@@ -9,7 +9,7 @@ namespace wi::version
// minor features, major updates, breaking compatibility changes
const int minor = 71;
// minor bug fixes, alterations, refactors, updates
const int revision = 643;
const int revision = 644;
const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);