Files
test2/source/blender/gpu/intern/gpu_compute.cc
Christoph Neuhauser ad4adccdeb GPU: Added image format validation for shader image bindings
The OpenGL specs require that the storage image qualifier in shaders
(e.g., "rgba32f") needs to be compatible with the format of a bound image
(see https://registry.khronos.org/OpenGL/specs/gl/glspec46.core.pdf#page=318).

We know that Blender currently does not handle this correctly in
multiple places. AMD and NVIDIA seem to silently ignore a mismatch and
just seem to use the format of the bound image. However, for the
Intel Windows drivers, this seems to lead to visual corruptions
(#141436, #141173). While a more graceful handling of a mismatch may
be nice, this is in line with the OpenGL specs.

This PR adds code for validating image formats for bindings.

Pull Request: https://projects.blender.org/blender/blender/pulls/143791
2025-08-27 15:43:09 +02:00

43 lines
1.3 KiB
C++

/* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup gpu
*/
#include "GPU_compute.hh"
#include "gpu_backend.hh"
#include "gpu_debug_private.hh"
void GPU_compute_dispatch(blender::gpu::Shader *shader,
uint groups_x_len,
uint groups_y_len,
uint groups_z_len,
const blender::gpu::shader::SpecializationConstants *constants_state)
{
blender::gpu::GPUBackend &gpu_backend = *blender::gpu::GPUBackend::get();
GPU_shader_bind(shader, constants_state);
#ifndef NDEBUG
blender::gpu::debug_validate_binding_image_format();
#endif
gpu_backend.compute_dispatch(groups_x_len, groups_y_len, groups_z_len);
}
void GPU_compute_dispatch_indirect(
blender::gpu::Shader *shader,
blender::gpu::StorageBuf *indirect_buf_,
const blender::gpu::shader::SpecializationConstants *constants_state)
{
blender::gpu::GPUBackend &gpu_backend = *blender::gpu::GPUBackend::get();
blender::gpu::StorageBuf *indirect_buf = reinterpret_cast<blender::gpu::StorageBuf *>(
indirect_buf_);
GPU_shader_bind(shader, constants_state);
#ifndef NDEBUG
blender::gpu::debug_validate_binding_image_format();
#endif
gpu_backend.compute_dispatch_indirect(indirect_buf);
}