Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2018-02-17 01:06:20 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-02-17 01:06:43 +0300
commit09eb790f4bbc89ceac0dda949f2f42a3c94883a4 (patch)
tree9fc827ccd42449b2e10d90f0e406430096f0c6e5
parent85f179eb238160050e3fdc507fc90da6c3c574e1 (diff)
DRW: Fix assert with DRW_shgroup_material_instance_create.
-rw-r--r--source/blender/draw/intern/draw_manager.c50
1 files changed, 28 insertions, 22 deletions
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index f60d10faa4f..ec068263234 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -794,30 +794,22 @@ static DRWShadingGroup *drw_shgroup_create_ex(struct GPUShader *shader, DRWPass
return shgroup;
}
-static DRWShadingGroup *drw_shgroup_material_create_ex(
- struct GPUMaterial *material, DRWPass *pass, Gwn_VertFormat *format, bool use_instancing)
+static DRWShadingGroup *drw_shgroup_material_create_ex(GPUPass *gpupass, DRWPass *pass)
{
- double time = 0.0; /* TODO make time variable */
-
- /* TODO : Ideally we should not convert. But since the whole codegen
- * is relying on GPUPass we keep it as is for now. */
- GPUPass *gpupass = GPU_material_get_pass(material);
-
if (!gpupass) {
/* Shader compilation error */
return NULL;
}
- struct GPUShader *shader = GPU_pass_shader(gpupass);
-
- DRWShadingGroup *grp = drw_shgroup_create_ex(shader, pass);
+ DRWShadingGroup *grp = drw_shgroup_create_ex(GPU_pass_shader(gpupass), pass);
+ return grp;
+}
- if (use_instancing) {
- drw_interface_instance_init(grp, shader, format);
- }
- else {
- drw_interface_init(&grp->interface, shader);
- }
+static DRWShadingGroup *drw_shgroup_material_inputs(
+ DRWShadingGroup *grp, struct GPUMaterial *material, GPUPass *gpupass)
+{
+ /* TODO : Ideally we should not convert. But since the whole codegen
+ * is relying on GPUPass we keep it as is for now. */
/* Converting dynamic GPUInput to DRWUniform */
ListBase *inputs = &gpupass->inputs;
@@ -825,6 +817,7 @@ static DRWShadingGroup *drw_shgroup_material_create_ex(
for (GPUInput *input = inputs->first; input; input = input->next) {
/* Textures */
if (input->ima) {
+ double time = 0.0; /* TODO make time variable */
GPUTexture *tex = GPU_texture_from_blender(
input->ima, input->iuser, input->textarget, input->image_isdata, time, 1);
@@ -868,19 +861,29 @@ static DRWShadingGroup *drw_shgroup_material_create_ex(
DRWShadingGroup *DRW_shgroup_material_create(
struct GPUMaterial *material, DRWPass *pass)
{
- DRWShadingGroup *shgroup = drw_shgroup_material_create_ex(material, pass, NULL, false);
+ GPUPass *gpupass = GPU_material_get_pass(material);
+ DRWShadingGroup *shgroup = drw_shgroup_material_create_ex(gpupass, pass);
+
+ if (shgroup) {
+ drw_interface_init(&shgroup->interface, GPU_pass_shader(gpupass));
+ drw_shgroup_material_inputs(shgroup, material, gpupass);
+ }
+
return shgroup;
}
DRWShadingGroup *DRW_shgroup_material_instance_create(
struct GPUMaterial *material, DRWPass *pass, Gwn_Batch *geom, Object *ob, Gwn_VertFormat *format)
{
- DRWShadingGroup *shgroup = drw_shgroup_material_create_ex(material, pass, format, true);
+ GPUPass *gpupass = GPU_material_get_pass(material);
+ DRWShadingGroup *shgroup = drw_shgroup_material_create_ex(gpupass, pass);
if (shgroup) {
shgroup->type = DRW_SHG_INSTANCE;
shgroup->instance_geom = geom;
shgroup->instance_data = ob->data;
+ drw_interface_instance_init(shgroup, GPU_pass_shader(gpupass), format);
+ drw_shgroup_material_inputs(shgroup, material, gpupass);
}
return shgroup;
@@ -892,12 +895,15 @@ DRWShadingGroup *DRW_shgroup_material_empty_tri_batch_create(
#ifdef USE_GPU_SELECT
BLI_assert((G.f & G_PICKSEL) == 0);
#endif
- /* Calling drw_interface_init because we don't need instancing_geom. */
- DRWShadingGroup *shgroup = drw_shgroup_material_create_ex(material, pass, NULL, false);
+ GPUPass *gpupass = GPU_material_get_pass(material);
+ DRWShadingGroup *shgroup = drw_shgroup_material_create_ex(gpupass, pass);
if (shgroup) {
shgroup->type = DRW_SHG_TRIANGLE_BATCH;
shgroup->interface.instance_count = size * 3;
+ /* Calling drw_interface_init will cause it to GWN_batch_draw_procedural. */
+ drw_interface_init(&shgroup->interface, GPU_pass_shader(gpupass));
+ drw_shgroup_material_inputs(shgroup, material, gpupass);
}
return shgroup;
@@ -958,7 +964,7 @@ DRWShadingGroup *DRW_shgroup_empty_tri_batch_create(struct GPUShader *shader, DR
#endif
DRWShadingGroup *shgroup = drw_shgroup_create_ex(shader, pass);
- /* Calling drw_interface_init because we don't need instancing_geom. */
+ /* Calling drw_interface_init will cause it to GWN_batch_draw_procedural. */
drw_interface_init(&shgroup->interface, shader);
shgroup->type = DRW_SHG_TRIANGLE_BATCH;