Draw Manager: Extend simplification to UBOs & fix a context error.
This commit is contained in:
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
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue