GPU: avoid multiple bind calls in GPU_draw_pbvh_buffers
Also add utility functions: GPU_basic_shader_bind_enable/disable so we don't have to get the previous state every time and manipulate it
This commit is contained in:
@@ -1205,8 +1205,7 @@ void ui_draw_but_UNITVEC(uiBut *but, uiWidgetColors *wcol, const rcti *rect)
|
||||
|
||||
qobj = gluNewQuadric();
|
||||
gluQuadricDrawStyle(qobj, GLU_FILL);
|
||||
int bound_options = GPU_basic_shader_bound_options();
|
||||
GPU_basic_shader_bind(bound_options);
|
||||
GPU_basic_shader_bind(GPU_basic_shader_bound_options());
|
||||
gluSphere(qobj, 100.0, 32, 24);
|
||||
gluDeleteQuadric(qobj);
|
||||
|
||||
|
||||
@@ -76,6 +76,9 @@ void GPU_basic_shaders_init(void);
|
||||
void GPU_basic_shaders_exit(void);
|
||||
|
||||
void GPU_basic_shader_bind(int options);
|
||||
void GPU_basic_shader_bind_enable(int options);
|
||||
void GPU_basic_shader_bind_disable(int options);
|
||||
|
||||
int GPU_basic_shader_bound_options(void);
|
||||
|
||||
/* Only use for small blocks of code that don't support glsl shader. */
|
||||
|
||||
@@ -520,6 +520,16 @@ void GPU_basic_shader_bind(int options)
|
||||
GPU_MATERIAL_STATE.bound_options = options;
|
||||
}
|
||||
|
||||
void GPU_basic_shader_bind_enable(int options)
|
||||
{
|
||||
GPU_basic_shader_bind(GPU_MATERIAL_STATE.bound_options | options);
|
||||
}
|
||||
|
||||
void GPU_basic_shader_bind_disable(int options)
|
||||
{
|
||||
GPU_basic_shader_bind(GPU_MATERIAL_STATE.bound_options & ~options);
|
||||
}
|
||||
|
||||
int GPU_basic_shader_bound_options(void)
|
||||
{
|
||||
/* ideally this should disappear, anything that uses this is making fragile
|
||||
|
||||
@@ -1843,15 +1843,15 @@ void GPU_draw_pbvh_buffers(GPU_PBVH_Buffers *buffers, DMSetMaterial setMaterial,
|
||||
if (buffers->vert_buf) {
|
||||
char *base = NULL;
|
||||
char *index_base = NULL;
|
||||
int bound_options = 0;
|
||||
/* weak inspection of bound options, should not be necessary ideally */
|
||||
const int bound_options_old = GPU_basic_shader_bound_options();
|
||||
int bound_options_new = 0;
|
||||
glEnableClientState(GL_VERTEX_ARRAY);
|
||||
if (!wireframe) {
|
||||
glEnableClientState(GL_NORMAL_ARRAY);
|
||||
glEnableClientState(GL_COLOR_ARRAY);
|
||||
|
||||
/* weak inspection of bound options, should not be necessary ideally */
|
||||
bound_options = GPU_basic_shader_bound_options();
|
||||
GPU_basic_shader_bind(bound_options | GPU_SHADER_USE_COLOR);
|
||||
bound_options_new |= GPU_SHADER_USE_COLOR;
|
||||
}
|
||||
|
||||
GPU_buffer_bind(buffers->vert_buf, GPU_BINDING_ARRAY);
|
||||
@@ -1867,9 +1867,13 @@ void GPU_draw_pbvh_buffers(GPU_PBVH_Buffers *buffers, DMSetMaterial setMaterial,
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||
}
|
||||
else {
|
||||
bound_options = GPU_basic_shader_bound_options();
|
||||
GPU_basic_shader_bind(bound_options | ((buffers->smooth || buffers->face_indices_len) ?
|
||||
0 : GPU_SHADER_FLAT_NORMAL));
|
||||
if ((buffers->smooth == false) && (buffers->face_indices_len == 0)) {
|
||||
bound_options_new |= GPU_SHADER_FLAT_NORMAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (bound_options_new & ~bound_options_old) {
|
||||
GPU_basic_shader_bind(bound_options_old | bound_options_new);
|
||||
}
|
||||
|
||||
if (buffers->tot_quad) {
|
||||
@@ -1944,7 +1948,10 @@ void GPU_draw_pbvh_buffers(GPU_PBVH_Buffers *buffers, DMSetMaterial setMaterial,
|
||||
if (!wireframe) {
|
||||
glDisableClientState(GL_NORMAL_ARRAY);
|
||||
glDisableClientState(GL_COLOR_ARRAY);
|
||||
GPU_basic_shader_bind(bound_options);
|
||||
}
|
||||
|
||||
if (bound_options_new & ~bound_options_old) {
|
||||
GPU_basic_shader_bind(bound_options_old);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user