Draw Manager: Extend simplification to UBOs & fix a context error.

This commit is contained in:
Clément Foucault 2017-05-09 23:55:02 +02:00
parent 8277609810
commit 707756d277
Notes: blender-bot 2023-02-14 08:45:12 +01:00
Referenced by issue #51511, 2.8 Draw Manager: face dots don't draw anymore
6 changed files with 43 additions and 23 deletions

View File

@ -529,7 +529,7 @@ static DRWShadingGroup *CLAY_object_shgrp_get(CLAY_Data *vedata, Object *ob, CLA
shgrps[id] = CLAY_shgroup_create(vedata, psl->clay_pass, &e_data.ubo_mat_idxs[id]);
/* if it's the first shgrp, pass bind the material UBO */
if (stl->storage->ubo_current_id == 1) {
DRW_shgroup_uniform_block(shgrps[0], "material_block", stl->mat_ubo, 0);
DRW_shgroup_uniform_block(shgrps[0], "material_block", stl->mat_ubo);
}
}

View File

@ -335,7 +335,7 @@ static DRWShadingGroup *eevee_cube_shadow_shgroup(
EEVEE_PassList *psl, EEVEE_StorageList *stl, struct Batch *geom, float (*obmat)[4])
{
DRWShadingGroup *grp = DRW_shgroup_instance_create(e_data.shadow_sh, psl->shadow_cube_pass, geom);
DRW_shgroup_uniform_block(grp, "shadow_render_block", stl->shadow_render_ubo, 0);
DRW_shgroup_uniform_block(grp, "shadow_render_block", stl->shadow_render_ubo);
DRW_shgroup_uniform_mat4(grp, "ShadowModelMatrix", (float *)obmat);
for (int i = 0; i < 6; ++i)
@ -348,7 +348,7 @@ static DRWShadingGroup *eevee_cascade_shadow_shgroup(
EEVEE_PassList *psl, EEVEE_StorageList *stl, struct Batch *geom, float (*obmat)[4])
{
DRWShadingGroup *grp = DRW_shgroup_instance_create(e_data.shadow_sh, psl->shadow_cascade_pass, geom);
DRW_shgroup_uniform_block(grp, "shadow_render_block", stl->shadow_render_ubo, 0);
DRW_shgroup_uniform_block(grp, "shadow_render_block", stl->shadow_render_ubo);
DRW_shgroup_uniform_mat4(grp, "ShadowModelMatrix", (float *)obmat);
for (int i = 0; i < MAX_CASCADE_NUM; ++i)
@ -523,8 +523,8 @@ static void EEVEE_cache_init(void *vedata)
psl->default_pass = DRW_pass_create("Default Shader Pass", state);
stl->g_data->default_lit_grp = DRW_shgroup_create(e_data.default_lit, psl->default_pass);
DRW_shgroup_uniform_block(stl->g_data->default_lit_grp, "light_block", stl->light_ubo, 0);
DRW_shgroup_uniform_block(stl->g_data->default_lit_grp, "shadow_block", stl->shadow_ubo, 1);
DRW_shgroup_uniform_block(stl->g_data->default_lit_grp, "light_block", stl->light_ubo);
DRW_shgroup_uniform_block(stl->g_data->default_lit_grp, "shadow_block", stl->shadow_ubo);
DRW_shgroup_uniform_int(stl->g_data->default_lit_grp, "light_count", &stl->lamps->num_light, 1);
DRW_shgroup_uniform_float(stl->g_data->default_lit_grp, "lodMax", &stl->probes->lodmax, 1);
DRW_shgroup_uniform_vec3(stl->g_data->default_lit_grp, "shCoefs[0]", (float *)stl->probes->shcoefs, 9);
@ -587,8 +587,8 @@ static void EEVEE_cache_populate(void *vedata, Object *ob)
if (shgrp) {
DRW_shgroup_call_add(shgrp, mat_geom[i], ob->obmat);
DRW_shgroup_uniform_block(shgrp, "light_block", stl->light_ubo, 0);
DRW_shgroup_uniform_block(shgrp, "shadow_block", stl->shadow_ubo, 1);
DRW_shgroup_uniform_block(shgrp, "light_block", stl->light_ubo);
DRW_shgroup_uniform_block(shgrp, "shadow_block", stl->shadow_ubo);
DRW_shgroup_uniform_int(shgrp, "light_count", &stl->lamps->num_light, 1);
DRW_shgroup_uniform_float(shgrp, "lodMax", &stl->probes->lodmax, 1);
DRW_shgroup_uniform_vec3(shgrp, "shCoefs[0]", (float *)stl->probes->shcoefs, 9);
@ -606,6 +606,9 @@ static void EEVEE_cache_populate(void *vedata, Object *ob)
DRW_shgroup_uniform_vec3(shgrp, "diffuse_col", col, 1);
DRW_shgroup_uniform_vec3(shgrp, "specular_col", spec, 1);
DRW_shgroup_uniform_short(shgrp, "hardness", &hardness, 1);
DRW_shgroup_uniform_texture(stl->g_data->default_lit_grp, "ltcMat", e_data.ltc_mat);
DRW_shgroup_uniform_texture(stl->g_data->default_lit_grp, "brdfLut", e_data.brdf_lut);
DRW_shgroup_uniform_texture(stl->g_data->default_lit_grp, "probeFiltered", txl->probe_pool);
DRW_shgroup_call_add(shgrp, mat_geom[i], ob->obmat);
}
}
@ -614,6 +617,9 @@ static void EEVEE_cache_populate(void *vedata, Object *ob)
DRW_shgroup_uniform_vec3(shgrp, "diffuse_col", &ma->r, 1);
DRW_shgroup_uniform_vec3(shgrp, "specular_col", &ma->specr, 1);
DRW_shgroup_uniform_short(shgrp, "hardness", &ma->har, 1);
DRW_shgroup_uniform_texture(stl->g_data->default_lit_grp, "ltcMat", e_data.ltc_mat);
DRW_shgroup_uniform_texture(stl->g_data->default_lit_grp, "brdfLut", e_data.brdf_lut);
DRW_shgroup_uniform_texture(stl->g_data->default_lit_grp, "probeFiltered", txl->probe_pool);
DRW_shgroup_call_add(shgrp, mat_geom[i], ob->obmat);
}

View File

@ -278,7 +278,7 @@ void DRW_shgroup_attrib_int(DRWShadingGroup *shgroup, const char *name, int size
void DRW_shgroup_attrib_float(DRWShadingGroup *shgroup, const char *name, int size);
void DRW_shgroup_uniform_texture(DRWShadingGroup *shgroup, const char *name, const struct GPUTexture *tex);
void DRW_shgroup_uniform_block(DRWShadingGroup *shgroup, const char *name, const struct GPUUniformBuffer *ubo, int loc);
void DRW_shgroup_uniform_block(DRWShadingGroup *shgroup, const char *name, const struct GPUUniformBuffer *ubo);
void DRW_shgroup_uniform_buffer(DRWShadingGroup *shgroup, const char *name, struct GPUTexture **tex);
void DRW_shgroup_uniform_bool(DRWShadingGroup *shgroup, const char *name, const bool *value, int arraysize);
void DRW_shgroup_uniform_float(DRWShadingGroup *shgroup, const char *name, const float *value, int arraysize);

View File

@ -163,7 +163,9 @@ struct DRWInterface {
int camtexfac;
int eye;
/* Textures */
int next_bind; /* next texture binding point */
int tex_bind; /* next texture binding point */
/* UBO */
int ubo_bind; /* next ubo binding point */
/* Dynamic batch */
GLuint instance_vbo;
int instance_count;
@ -538,7 +540,8 @@ static DRWInterface *DRW_interface_create(GPUShader *shader)
interface->attribs_count = 0;
interface->attribs_stride = 0;
interface->instance_vbo = 0;
interface->next_bind = GPU_max_textures() - 1;
interface->tex_bind = GPU_max_textures() - 1;
interface->ubo_bind = GPU_max_ubo_binds() - 1;
memset(&interface->vbo_format, 0, sizeof(VertexFormat));
@ -856,30 +859,41 @@ void DRW_shgroup_attrib_float(DRWShadingGroup *shgroup, const char *name, int si
void DRW_shgroup_uniform_texture(DRWShadingGroup *shgroup, const char *name, const GPUTexture *tex)
{
DRWInterface *interface = shgroup->interface;
if (interface->next_bind < 0) {
if (interface->tex_bind < 0) {
/* TODO alert user */
printf("Not enough texture slot for %s\n", name);
return;
}
else {
DRW_interface_uniform(shgroup, name, DRW_UNIFORM_TEXTURE, tex, 0, 1, interface->next_bind--);
}
DRW_interface_uniform(shgroup, name, DRW_UNIFORM_TEXTURE, tex, 0, 1, interface->tex_bind--);
}
void DRW_shgroup_uniform_block(DRWShadingGroup *shgroup, const char *name, const GPUUniformBuffer *ubo, int loc)
void DRW_shgroup_uniform_block(DRWShadingGroup *shgroup, const char *name, const GPUUniformBuffer *ubo)
{
DRW_interface_uniform(shgroup, name, DRW_UNIFORM_BLOCK, ubo, 0, 1, loc);
DRWInterface *interface = shgroup->interface;
/* Be carefull: there is also a limit per shader stage. Usually 1/3 of normal limit. */
if (interface->ubo_bind < 0) {
/* TODO alert user */
printf("Not enough ubo slots for %s\n", name);
return;
}
DRW_interface_uniform(shgroup, name, DRW_UNIFORM_BLOCK, ubo, 0, 1, interface->ubo_bind--);
}
void DRW_shgroup_uniform_buffer(DRWShadingGroup *shgroup, const char *name, GPUTexture **tex)
{
DRWInterface *interface = shgroup->interface;
if (interface->next_bind < 0) {
if (interface->tex_bind < 0) {
/* TODO alert user */
printf("Not enough texture slot for %s\n", name);
return;
}
else {
DRW_interface_uniform(shgroup, name, DRW_UNIFORM_BUFFER, tex, 0, 1, interface->next_bind--);
}
DRW_interface_uniform(shgroup, name, DRW_UNIFORM_BUFFER, tex, 0, 1, interface->tex_bind--);
}
void DRW_shgroup_uniform_bool(DRWShadingGroup *shgroup, const char *name, const bool *value, int arraysize)

View File

@ -268,7 +268,7 @@ static DRWPass *edit_mesh_create_overlay_pass(
DRW_STATE_WRITE_COLOR | DRW_STATE_POINT | statemod);
*r_face_shgrp = DRW_shgroup_create(tri_sh, pass);
DRW_shgroup_uniform_block(*r_face_shgrp, "globalsBlock", globals_ubo, 0);
DRW_shgroup_uniform_block(*r_face_shgrp, "globalsBlock", globals_ubo);
DRW_shgroup_uniform_vec2(*r_face_shgrp, "viewportSize", DRW_viewport_size_get(), 1);
DRW_shgroup_uniform_float(*r_face_shgrp, "faceAlphaMod", faceAlpha, 1);
@ -371,7 +371,7 @@ static void EDIT_MESH_cache_init(void *vedata)
"Front Face Color",
DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS | DRW_STATE_BLEND);
stl->g_data->facefill_occluded_shgrp = DRW_shgroup_create(e_data.overlay_facefill_sh, psl->facefill_occlude);
DRW_shgroup_uniform_block(stl->g_data->facefill_occluded_shgrp, "globalsBlock", globals_ubo, 0);
DRW_shgroup_uniform_block(stl->g_data->facefill_occluded_shgrp, "globalsBlock", globals_ubo);
/* we need a full screen pass to combine the result */
struct Batch *quad = DRW_cache_fullscreen_quad_get();

View File

@ -582,7 +582,7 @@ static void OBJECT_cache_init(void *vedata)
DRW_shgroup_uniform_vec3(grp, "cameraPos", e_data.camera_pos, 1);
DRW_shgroup_uniform_vec4(grp, "gridSettings", e_data.grid_settings, 1);
DRW_shgroup_uniform_float(grp, "gridOneOverLogSubdiv", &e_data.grid_settings[4], 1);
DRW_shgroup_uniform_block(grp, "globalsBlock", globals_ubo, 0);
DRW_shgroup_uniform_block(grp, "globalsBlock", globals_ubo);
DRW_shgroup_call_add(grp, quad, mat);
grp = DRW_shgroup_create(e_data.grid_sh, psl->grid);