Commit: 0ef981f603a0d03a1b187995c91282c73ed50bd7
Author: Clément Foucault
Date:   Wed Feb 14 18:59:15 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB0ef981f603a0d03a1b187995c91282c73ed50bd7

DRW: Refactor: Less feature duplication with Gwn.

This removes the need of custom attribs for instancing.
Instancing works fully with dynamic batches & Gwn_VertFormat now.

This is in prevision of the VAO manager patch.

===================================================================

M       source/blender/draw/engines/eevee/eevee_effects.c
M       source/blender/draw/engines/eevee/eevee_lightprobes.c
M       source/blender/draw/engines/eevee/eevee_lights.c
M       source/blender/draw/engines/eevee/eevee_render.c
M       source/blender/draw/intern/DRW_render.h
M       source/blender/draw/intern/draw_common.c
M       source/blender/draw/intern/draw_common.h
M       source/blender/draw/intern/draw_manager.c
M       source/blender/draw/modes/object_mode.c

===================================================================

diff --git a/source/blender/draw/engines/eevee/eevee_effects.c 
b/source/blender/draw/engines/eevee/eevee_effects.c
index be39e06bac9..9afe54d08fc 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -241,7 +241,8 @@ void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, 
EEVEE_Data *vedata)
        {
                static int zero = 0;
                psl->color_downsample_cube_ps = DRW_pass_create("Downsample 
Cube", DRW_STATE_WRITE_COLOR);
-               DRWShadingGroup *grp = 
DRW_shgroup_instance_create(e_data.downsample_cube_sh, 
psl->color_downsample_cube_ps, quad);
+               DRWShadingGroup *grp = 
DRW_shgroup_instance_create(e_data.downsample_cube_sh, 
psl->color_downsample_cube_ps,
+                                                                  quad, NULL);
                DRW_shgroup_uniform_buffer(grp, "source", &e_data.color_src);
                DRW_shgroup_uniform_float(grp, "texelSize", 
&e_data.cube_texel_size, 1);
                DRW_shgroup_uniform_int(grp, "Layer", &zero, 1);
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c 
b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index 6fd20233784..beed1416715 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -36,6 +36,7 @@
 #include "DNA_view3d_types.h"
 
 #include "BKE_object.h"
+#include "MEM_guardedalloc.h"
 
 #include "GPU_material.h"
 #include "GPU_texture.h"
@@ -82,6 +83,9 @@ static struct {
        struct GPUTexture *depth_array_placeholder;
        struct GPUTexture *cube_face_minmaxz;
 
+       struct Gwn_VertFormat *format_probe_display_cube;
+       struct Gwn_VertFormat *format_probe_display_planar;
+
        int update_world;
 } e_data = {NULL}; /* Engine data */
 
@@ -433,9 +437,7 @@ void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData 
*sldata, EEVEE_Data *vedat
        {
                psl->probe_glossy_compute = DRW_pass_create("LightProbe Glossy 
Compute", DRW_STATE_WRITE_COLOR);
 
-               struct Gwn_Batch *geom = DRW_cache_fullscreen_quad_get();
-
-               DRWShadingGroup *grp = 
DRW_shgroup_instance_create(e_data.probe_filter_glossy_sh, 
psl->probe_glossy_compute, geom);
+               DRWShadingGroup *grp = 
DRW_shgroup_create(e_data.probe_filter_glossy_sh, psl->probe_glossy_compute);
                DRW_shgroup_uniform_float(grp, "intensityFac", 
&pinfo->intensity_fac, 1);
                DRW_shgroup_uniform_float(grp, "sampleCount", 
&pinfo->samples_ct, 1);
                DRW_shgroup_uniform_float(grp, "invSampleCount", 
&pinfo->invsamples_ct, 1);
@@ -448,8 +450,7 @@ void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData 
*sldata, EEVEE_Data *vedat
                DRW_shgroup_uniform_texture(grp, "texHammersley", 
e_data.hammersley);
                // DRW_shgroup_uniform_texture(grp, "texJitter", e_data.jitter);
                DRW_shgroup_uniform_texture(grp, "probeHdr", sldata->probe_rt);
-
-               DRW_shgroup_set_instance_count(grp, 1);
+               DRW_shgroup_call_add(grp, DRW_cache_fullscreen_quad_get(), 
NULL);
        }
 
        {
@@ -505,18 +506,30 @@ void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData 
*sldata, EEVEE_Data *vedat
                DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH 
| DRW_STATE_DEPTH_LESS | DRW_STATE_CULL_BACK;
                psl->probe_display = DRW_pass_create("LightProbe Display", 
state);
 
-               struct Gwn_Batch *geom = DRW_cache_sphere_get();
-               DRWShadingGroup *grp = stl->g_data->cube_display_shgrp = 
DRW_shgroup_instance_create(e_data.probe_cube_display_sh, psl->probe_display, 
geom);
-               DRW_shgroup_attrib_float(grp, "probe_id", 1); /* XXX this works 
because we are still uploading 4bytes and using the right stride */
-               DRW_shgroup_attrib_float(grp, "probe_location", 3);
-               DRW_shgroup_attrib_float(grp, "sphere_size", 1);
+               DRW_shgroup_instance_format(e_data.format_probe_display_cube, {
+                   {"probe_id"      , DRW_ATTRIB_INT, 1},
+                   {"probe_location", DRW_ATTRIB_FLOAT, 3},
+                   {"sphere_size"   , DRW_ATTRIB_FLOAT, 1},
+               });
+
+               DRWShadingGroup *grp = 
DRW_shgroup_instance_create(e_data.probe_cube_display_sh,
+                                                                  
psl->probe_display,
+                                                                  
DRW_cache_sphere_get(),
+                                                                  
e_data.format_probe_display_cube);
+               stl->g_data->cube_display_shgrp = grp;
                DRW_shgroup_uniform_buffer(grp, "probeCubes", 
&sldata->probe_pool);
                DRW_shgroup_uniform_block(grp, "common_block", 
sldata->common_ubo);
 
-               geom = DRW_cache_quad_get();
-               grp = stl->g_data->planar_display_shgrp = 
DRW_shgroup_instance_create(e_data.probe_planar_display_sh, psl->probe_display, 
geom);
-               DRW_shgroup_attrib_float(grp, "probe_id", 1); /* XXX this works 
because we are still uploading 4bytes and using the right stride */
-               DRW_shgroup_attrib_float(grp, "probe_mat", 16);
+               DRW_shgroup_instance_format(e_data.format_probe_display_planar, 
{
+                   {"probe_id" , DRW_ATTRIB_INT, 1},
+                   {"probe_mat", DRW_ATTRIB_FLOAT, 16},
+               });
+
+               grp = 
DRW_shgroup_instance_create(e_data.probe_planar_display_sh,
+                                                 psl->probe_display,
+                                                 DRW_cache_quad_get(),
+                                                 
e_data.format_probe_display_planar);
+               stl->g_data->planar_display_shgrp = grp;
                DRW_shgroup_uniform_buffer(grp, "probePlanars", 
&txl->planar_pool);
        }
 
@@ -524,7 +537,10 @@ void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData 
*sldata, EEVEE_Data *vedat
                psl->probe_planar_downsample_ps = DRW_pass_create("LightProbe 
Planar Downsample", DRW_STATE_WRITE_COLOR);
 
                struct Gwn_Batch *geom = DRW_cache_fullscreen_quad_get();
-               DRWShadingGroup *grp = stl->g_data->planar_downsample = 
DRW_shgroup_instance_create(e_data.probe_planar_downsample_sh, 
psl->probe_planar_downsample_ps, geom);
+               DRWShadingGroup *grp = 
DRW_shgroup_instance_create(e_data.probe_planar_downsample_sh,
+                                                                  
psl->probe_planar_downsample_ps,
+                                                                  geom, NULL);
+               stl->g_data->planar_downsample = grp;
                DRW_shgroup_uniform_buffer(grp, "source", &txl->planar_pool);
                DRW_shgroup_uniform_float(grp, "fireflyFactor", 
&sldata->common_data.ssr_firefly_fac, 1);
        }
@@ -827,7 +843,9 @@ static void EEVEE_lightprobes_updates(EEVEE_ViewLayerData 
*sldata, EEVEE_PassLis
                    (probe->flag & LIGHTPROBE_FLAG_SHOW_DATA))
                {
                        struct Gwn_Batch *geom = DRW_cache_sphere_get();
-                       DRWShadingGroup *grp = 
DRW_shgroup_instance_create(e_data.probe_grid_display_sh, psl->probe_display, 
geom);
+                       DRWShadingGroup *grp = 
DRW_shgroup_instance_create(e_data.probe_grid_display_sh,
+                                                                          
psl->probe_display,
+                                                                          
geom, NULL);
                        DRW_shgroup_set_instance_count(grp, ped->num_cell);
                        DRW_shgroup_uniform_int(grp, "offset", &egrid->offset, 
1);
                        DRW_shgroup_uniform_ivec3(grp, "grid_resolution", 
egrid->resolution, 1);
@@ -1695,6 +1713,8 @@ void EEVEE_lightprobes_refresh(EEVEE_ViewLayerData 
*sldata, EEVEE_Data *vedata)
 
 void EEVEE_lightprobes_free(void)
 {
+       MEM_SAFE_FREE(e_data.format_probe_display_cube);
+       MEM_SAFE_FREE(e_data.format_probe_display_planar);
        DRW_SHADER_FREE_SAFE(e_data.probe_default_sh);
        DRW_SHADER_FREE_SAFE(e_data.probe_filter_glossy_sh);
        DRW_SHADER_FREE_SAFE(e_data.probe_filter_diffuse_sh);
diff --git a/source/blender/draw/engines/eevee/eevee_lights.c 
b/source/blender/draw/engines/eevee/eevee_lights.c
index 69b58bf9670..6f96d1af3ed 100644
--- a/source/blender/draw/engines/eevee/eevee_lights.c
+++ b/source/blender/draw/engines/eevee/eevee_lights.c
@@ -380,12 +380,12 @@ void EEVEE_lights_cache_add(EEVEE_ViewLayerData *sldata, 
Object *ob)
 void EEVEE_lights_cache_shcaster_add(
         EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl, struct Gwn_Batch 
*geom, float (*obmat)[4])
 {
-       DRWShadingGroup *grp = DRW_shgroup_instance_create(e_data.shadow_sh, 
psl->shadow_cube_pass, geom);
+       DRWShadingGroup *grp = DRW_shgroup_instance_create(e_data.shadow_sh, 
psl->shadow_cube_pass, geom, NULL);
        DRW_shgroup_uniform_block(grp, "shadow_render_block", 
sldata->shadow_render_ubo);
        DRW_shgroup_uniform_mat4(grp, "ShadowModelMatrix", (float *)obmat);
        DRW_shgroup_set_instance_count(grp, 6);
 
-       grp = DRW_shgroup_instance_create(e_data.shadow_sh, 
psl->shadow_cascade_pass, geom);
+       grp = DRW_shgroup_instance_create(e_data.shadow_sh, 
psl->shadow_cascade_pass, geom, NULL);
        DRW_shgroup_uniform_block(grp, "shadow_render_block", 
sldata->shadow_render_ubo);
        DRW_shgroup_uniform_mat4(grp, "ShadowModelMatrix", (float *)obmat);
        DRW_shgroup_set_instance_count(grp, MAX_CASCADE_NUM);
@@ -395,7 +395,7 @@ void EEVEE_lights_cache_shcaster_material_add(
        EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl, struct GPUMaterial 
*gpumat,
        struct Gwn_Batch *geom, struct Object *ob, float (*obmat)[4], float 
*alpha_threshold)
 {
-       DRWShadingGroup *grp = DRW_shgroup_material_instance_create(gpumat, 
psl->shadow_cube_pass, geom, ob);
+       DRWShadingGroup *grp = DRW_shgroup_material_instance_create(gpumat, 
psl->shadow_cube_pass, geom, ob, NULL);
 
        if (grp == NULL) return;
 
@@ -407,7 +407,7 @@ void EEVEE_lights_cache_shcaster_material_add(
 
        DRW_shgroup_set_instance_count(grp, 6);
 
-       grp = DRW_shgroup_material_instance_create(gpumat, 
psl->shadow_cascade_pass, geom, ob);
+       grp = DRW_shgroup_material_instance_create(gpumat, 
psl->shadow_cascade_pass, geom, ob, NULL);
        DRW_shgroup_uniform_block(grp, "shadow_render_block", 
sldata->shadow_render_ubo);
        DRW_shgroup_uniform_mat4(grp, "ShadowModelMatrix", (float *)obmat);
 
diff --git a/source/blender/draw/engines/eevee/eevee_render.c 
b/source/blender/draw/engines/eevee/eevee_render.c
index 33c8e2602d4..4524ac397e7 100644
--- a/source/blender/draw/engines/eevee/eevee_render.c
+++ b/source/blender/draw/engines/eevee/eevee_render.c
@@ -394,6 +394,9 @@ void EEVEE_render_draw(EEVEE_Data *vedata, struct 
RenderEngine *engine, struct D
        /* Sort transparents before the loop. */
        DRW_pass_sort_shgroup_z(psl->transparent_pass);
 
+       /* Push instances attribs to the GPU. */
+       DRW_render_instance_buffer_finish();
+
        if ((view_layer->passflag & (SCE_PASS_SUBSURFACE_COLOR |
                                     SCE_PASS_SUBSURFACE_DIRECT |
                                     SCE_PASS_SUBSURFACE_INDIRECT)) != 0)
diff --git a/source/blender/draw/int

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to