GPU: Avoid undocumented/fragile dependency on shader enumerator order

Previously this was using `GPU_SHADER_TEXT` as default value indicating
an "unset" state. This wasn't documented in the definition (and so
D16284 added a new enumerator that broke this). Plus code was assuming
this enumerator would always have the value 0 without specifying this in
the definition either.

In this case it's easy to not rely on the enum value at all, and just
use `std::optional` to add a "unset" state.

Differential Revision: https://developer.blender.org/D16303
This commit is contained in:
2022-10-20 12:51:20 +02:00
parent 8a43bfd8fd
commit c81bc09876
2 changed files with 12 additions and 7 deletions

View File

@@ -45,7 +45,7 @@ void immBindShader(GPUShader *shader)
BLI_assert(imm->shader == nullptr); BLI_assert(imm->shader == nullptr);
imm->shader = shader; imm->shader = shader;
imm->builtin_shader_bound = GPU_SHADER_TEXT; /* Default value. */ imm->builtin_shader_bound = std::nullopt;
if (!imm->vertex_format.packed) { if (!imm->vertex_format.packed) {
VertexFormat_pack(&imm->vertex_format); VertexFormat_pack(&imm->vertex_format);
@@ -125,9 +125,12 @@ static void wide_line_workaround_start(GPUPrimType prim_type)
/* No need to change the shader. */ /* No need to change the shader. */
return; return;
} }
if (!imm->builtin_shader_bound) {
return;
}
eGPUBuiltinShader polyline_sh; eGPUBuiltinShader polyline_sh;
switch (imm->builtin_shader_bound) { switch (*imm->builtin_shader_bound) {
case GPU_SHADER_3D_CLIPPED_UNIFORM_COLOR: case GPU_SHADER_3D_CLIPPED_UNIFORM_COLOR:
polyline_sh = GPU_SHADER_3D_POLYLINE_CLIPPED_UNIFORM_COLOR; polyline_sh = GPU_SHADER_3D_POLYLINE_CLIPPED_UNIFORM_COLOR;
break; break;
@@ -180,8 +183,8 @@ static void wide_line_workaround_end()
} }
immUnbindProgram(); immUnbindProgram();
immBindBuiltinProgram(imm->prev_builtin_shader); immBindBuiltinProgram(*imm->prev_builtin_shader);
imm->prev_builtin_shader = GPU_SHADER_TEXT; imm->prev_builtin_shader = std::nullopt;
} }
} }

View File

@@ -9,6 +9,8 @@
#pragma once #pragma once
#include <optional>
#include "GPU_batch.h" #include "GPU_batch.h"
#include "GPU_primitive.h" #include "GPU_primitive.h"
#include "GPU_shader.h" #include "GPU_shader.h"
@@ -42,9 +44,9 @@ class Immediate {
/** Wide Line workaround. */ /** Wide Line workaround. */
/** Previously bound shader to restore after drawing. */ /** Previously bound shader to restore after drawing. */
eGPUBuiltinShader prev_builtin_shader = GPU_SHADER_TEXT; std::optional<eGPUBuiltinShader> prev_builtin_shader;
/** Builtin shader index. Used to test if the workaround can be done. */ /** Builtin shader index. Used to test if the line width workaround can be done. */
eGPUBuiltinShader builtin_shader_bound = GPU_SHADER_TEXT; std::optional<eGPUBuiltinShader> builtin_shader_bound;
/** Uniform color: Kept here to update the wide-line shader just before #immBegin. */ /** Uniform color: Kept here to update the wide-line shader just before #immBegin. */
float uniform_color[4]; float uniform_color[4];