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:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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];
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user