Commit: 5333b2aa00e2e7d1640ad6fff1bf1d858f828acf
Author: Clément Foucault
Date:   Thu Jan 5 16:13:20 2017 +0100
Branches: clay-engine
https://developer.blender.org/rB5333b2aa00e2e7d1640ad6fff1bf1d858f828acf

(Clay) Free memory + lots of renaming/reorganizing

Signed-off-by: Clément Foucault <[email protected]>

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

M       source/blender/draw/DRW_engine.h
M       source/blender/draw/engines/clay/clay.c
M       source/blender/draw/engines/clay/clay.h
M       source/blender/draw/intern/DRW_render.h
M       source/blender/draw/intern/draw_manager.c
M       source/blender/gpu/CMakeLists.txt
M       source/blender/gpu/GPU_viewport.h
M       source/blender/gpu/intern/gpu_viewport.c
M       source/blender/makesrna/intern/rna_scene.c
M       source/blender/render/intern/source/external_engine.c

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

diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index 81831a3..43e0657 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -26,34 +26,11 @@
 #ifndef __DRW_ENGINE_H__
 #define __DRW_ENGINE_H__
 
-typedef enum {
-       DRW_UNIFORM_INT,
-       DRW_UNIFORM_FLOAT,
-       DRW_UNIFORM_TEXTURE,
-       DRW_UNIFORM_BUFFER,
-       DRW_UNIFORM_MAT3,
-       DRW_UNIFORM_MAT4
-} DRWUniformType;
+struct DRWPass;
 
-typedef struct DRWUniform {
-       struct DRWUniform *next, *prev;
-       DRWUniformType type;
-       int location;
-       int length;
-       int arraysize;
-       int bindloc;
-       const void *value;
-} DRWUniform;
+void DRW_engines_init(void);
+void DRW_engines_free(void);
 
-typedef struct DRWInterface {
-       ListBase uniforms;
-       /* matrices locations */
-       int modelview;
-       int projection;
-       int modelviewprojection;
-       int normal;
-} DRWInterface;
-
-void DRW_viewport_engine_init(void);
+void DRW_pass_free(struct DRWPass *pass);
 
 #endif /* __DRW_ENGINE_H__ */
\ No newline at end of file
diff --git a/source/blender/draw/engines/clay/clay.c 
b/source/blender/draw/engines/clay/clay.c
index cfc2916..00e4fd6 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -40,11 +40,9 @@ extern char datatoc_clay_vert_glsl[];
 
 static struct CLAY_data {
        /* Depth Pre Pass */
-       struct DRWPass *depth_pass;
        struct GPUShader *depth_sh;
        struct DRWInterface *depth_itf;
        /* Shading Pass */
-       struct DRWPass *clay_pass;
        struct GPUShader *clay_sh;
        struct DRWInterface *clay_itf;
 
@@ -82,13 +80,19 @@ typedef struct CLAY_TextureList{
 #define SCENE_DEPTH 1
 #define SCENE_DEPTH_LOW 2
 
+/* keep it under MAX_PASSES */
+typedef struct CLAY_PassList{
+       struct DRWPass *depth_pass;
+       struct DRWPass *clay_pass;
+} CLAY_PassList;
+
 /* Functions */
 static void add_icon_to_rect(PreviewImage *prv, float *final_rect, int layer)
 {
        int image_size = prv->w[0] * prv->h[0];
        float *new_rect = &final_rect[image_size * 4 * layer];
 
-       IMB_buffer_float_from_byte(new_rect, prv->rect[0], IB_PROFILE_SRGB, 
IB_PROFILE_SRGB,
+       IMB_buffer_float_from_byte(new_rect, (unsigned char *)prv->rect[0], 
IB_PROFILE_SRGB, IB_PROFILE_SRGB,
                                   false, prv->w[0], prv->h[0], prv->w[0], 
prv->w[0]);
 }
 
@@ -136,9 +140,12 @@ static int matcap_to_index(int matcap)
        return 0;
 }
 
-static void clay_init_engine(void)
+static void clay_engine_init(void)
 {
-       DRWBatch *batch;
+       static bool done = false;
+
+       /* Only init Once */
+       if (done) return;
 
        /* Create Texture Array */
        {
@@ -174,46 +181,12 @@ static void clay_init_engine(void)
        }
 
        /* Depth prepass */
-       {
-               data.depth_sh = DRW_shader_create_3D_depth_only();
-               data.depth_itf = DRW_interface_create(data.depth_sh);
-
-               data.depth_pass = (DRWPass *)MEM_callocN(sizeof(DRWPass), 
"DRWPass depth_pass");
-               data.depth_pass->state = DRW_STATE_WRITE_DEPTH | 
DRW_STATE_DEPTH_LESS;
-
-               batch = (DRWBatch *)MEM_callocN(sizeof(DRWBatch), "DRWBatch");
-               batch->shader = data.depth_sh;
-               batch->interface = data.depth_itf;
-               BLI_addtail(&data.depth_pass->batches, batch);
-       }
+       data.depth_sh = DRW_shader_create_3D_depth_only();
 
        /* Shading pass */
-       {
-               int bindloc = 0;
-               data.matcap_id = 5;
-
-               data.clay_sh = DRW_shader_create(datatoc_clay_vert_glsl, NULL, 
datatoc_clay_frag_glsl, NULL);
-               data.clay_itf = DRW_interface_create(data.clay_sh);
+       data.clay_sh = DRW_shader_create(datatoc_clay_vert_glsl, NULL, 
datatoc_clay_frag_glsl, NULL);
 
-               DRW_interface_uniform_ivec2(data.clay_sh, data.clay_itf, 
"screenres", DRW_viewport_size_get(), 1);
-               DRW_interface_uniform_buffer(data.clay_sh, data.clay_itf, 
"depthtex", SCENE_DEPTH, bindloc++);
-               DRW_interface_uniform_texture(data.clay_sh, data.clay_itf, 
"matcaps", data.matcap_array, bindloc++);
-               DRW_interface_uniform_int(data.clay_sh, data.clay_itf, 
"matcap_index", &data.matcap_id, 1);
-
-               /* SSAO */
-               DRW_interface_uniform_mat4(data.clay_sh, data.clay_itf, 
"WinMatrix", data.winmat);
-               DRW_interface_uniform_vec4(data.clay_sh, data.clay_itf, 
"viewvecs", data.viewvecs, 3);
-               DRW_interface_uniform_vec4(data.clay_sh, data.clay_itf, 
"ssao_params", data.ssao_params, 1);
-               DRW_interface_uniform_vec3(data.clay_sh, data.clay_itf, 
"ssao_sample_params", data.sample_params, 1);
-
-               data.clay_pass = (DRWPass *)MEM_callocN(sizeof(DRWPass), 
"DRWPass clay_pass");
-               data.clay_pass->state = DRW_STATE_WRITE_COLOR;
-
-               batch = (DRWBatch *)MEM_callocN(sizeof(DRWBatch), "DRWBatch");
-               batch->shader = data.clay_sh;
-               batch->interface = data.clay_itf;
-               BLI_addtail(&data.clay_pass->batches, batch);
-       }
+       done = true;
 }
 
 #if 0
@@ -227,18 +200,50 @@ static void clay_init_view(CLAY_FramebufferList *buffers, 
CLAY_TextureList *text
 }
 #endif
 
-static void clay_populate_batch(const struct bContext *C)
+static void clay_populate_passes(CLAY_PassList *passes, const struct bContext 
*C)
 {
        Scene *scene = CTX_data_scene(C);
        Scene *sce_iter;
        Base *base;
-       DRWBatch *matcapbatch = data.clay_pass->batches.first;
-       DRWBatch *depthbatch = data.depth_pass->batches.first;
+       struct DRWBatch *matcapbatch, *depthbatch;
+       bool pop_depth = false;
+       bool pop_clay = false;
+
+       if (!passes->depth_pass) {
+               passes->depth_pass = DRW_pass_create("Clay Pass", 
DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
+
+               depthbatch = DRW_batch_create(data.depth_sh, 
passes->depth_pass);
+               pop_depth = true;
+       }
+
+       if (!passes->clay_pass) {
+               struct DRWBatch *batch;
+               const int depthloc = 0;
+               const int matcaploc = 1;
+
+               passes->clay_pass = DRW_pass_create("Clay Pass", 
DRW_STATE_WRITE_COLOR);
+
+               batch = DRW_batch_create(data.clay_sh, passes->clay_pass);
+
+               DRW_batch_uniform_ivec2(batch, "screenres", 
DRW_viewport_size_get(), 1);
+               DRW_batch_uniform_buffer(batch, "depthtex", SCENE_DEPTH, 
depthloc);
+               DRW_batch_uniform_texture(batch, "matcaps", data.matcap_array, 
matcaploc);
+               DRW_batch_uniform_int(batch, "matcap_index", &data.matcap_id, 
1);
+
+               /* SSAO */
+               DRW_batch_uniform_mat4(batch, "WinMatrix", (float 
*)data.winmat);
+               DRW_batch_uniform_vec4(batch, "viewvecs", (float 
*)data.viewvecs, 3);
+               DRW_batch_uniform_vec4(batch, "ssao_params", data.ssao_params, 
1);
+               DRW_batch_uniform_vec3(batch, "ssao_sample_params", 
data.sample_params, 1);
+
+               matcapbatch = batch;
+               pop_clay = true;
+       }
 
        for (SETLOOPER(scene, sce_iter, base)) {
                /* Add everything for now */
-               BLI_addtail(&matcapbatch->objects, base);
-               BLI_addtail(&depthbatch->objects, base);
+               if (pop_clay) DRW_batch_add_surface(matcapbatch, base);
+               if (pop_depth) DRW_batch_add_surface(depthbatch, base);
        }
 }
 
@@ -297,11 +302,11 @@ static void clay_view_draw(RenderEngine *UNUSED(engine), 
const struct bContext *
         * so get the current viewport buffers */
        CLAY_FramebufferList *buffers = NULL;
        CLAY_TextureList *textures = NULL;
+       CLAY_PassList *passes = NULL;
+
+       DRW_viewport_init(context, (void **)&buffers, (void **)&textures, (void 
**)&passes);
 
-       DRW_viewport_init(context, (void **)&buffers, (void **)&textures);
-       
-       if (!data.clay_sh)
-               clay_init_engine();
+       clay_engine_init();
 
        /* Settings */
        EngineDataClay *engine_data = &CTX_data_scene(context)->claydata;
@@ -320,25 +325,36 @@ static void clay_view_draw(RenderEngine *UNUSED(engine), 
const struct bContext *
        static bool first = true;
        if (first) {
                first = false;
-               clay_populate_batch(context);
+               clay_populate_passes(passes, context);
        }
 
        DRW_draw_background();
 
        /* Pass 1 : Depth pre-pass */
-       DRW_draw_pass(data.depth_pass);
-
-       clay_ssao_setup();
+       DRW_draw_pass(passes->depth_pass);
 
        /* Pass 2 : Shading */
+       clay_ssao_setup();
        DRW_framebuffer_texture_detach(textures->depth);
-       DRW_draw_pass(data.clay_pass);
+       DRW_draw_pass(passes->clay_pass);
        DRW_framebuffer_texture_attach(buffers->default_fb, textures->depth, 0);
 
        /* Always finish by this */
        DRW_state_reset();
 }
 
+void clay_engine_free(void)
+{
+       /* data.depth_sh Is builtin so it's automaticaly freed */
+       if (data.clay_sh) {
+               DRW_shader_free(data.clay_sh);
+       }
+
+       if (data.matcap_array) {
+               DRW_texture_free(data.matcap_array);
+       }
+}
+
 RenderEngineType viewport_clay_type = {
        NULL, NULL,
        "BLENDER_CLAY", N_("Clay"), RE_INTERNAL | RE_USE_OGL_PIPELINE,
diff --git a/source/blender/draw/engines/clay/clay.h 
b/source/blender/draw/engines/clay/clay.h
index a9da34c..28d9c98 100644
--- a/source/blender/draw/engines/clay/clay.h
+++ b/source/blender/draw/engines/clay/clay.h
@@ -23,4 +23,6 @@
 
 extern RenderEngineType viewport_clay_type;
 
+void clay_engine_free(void);
+
 #endif /* __ENGINE_CLAY_H__ */
\ No newline at end of file
diff --git a/source/blender/draw/intern/DRW_render.h 
b/source/blender/draw/intern/DRW_render.h
index 49a65cc..ce95c09 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -45,54 +45,20 @@
 
 #include "RE_engine.h"
 
-typedef struct DRWBatch {
-       struct DRWBatch *next, *prev;
-       struct GPUShader *shader;        // Shader to bind
-       struct DRWInterface *interface;  // Uniforms values
-       ListBase objects;               // List with all objects and transform
-} DRWBatch;
-
-typedef enum {
-       DRW_STATE_WRITE_DEPTH = (1 << 0),
-       DRW_STATE_WRITE_COLOR = (1 << 1),
-       DRW_STATE_DEPTH_LESS  = (1 << 2),
-       DRW_STATE_DEPTH_EQUAL = (1 << 3),
-       DRW_STATE_CULL_BACK   = (1 << 4),
-       DRW_STATE_CULL_FRONT  = (1 << 5)
-       /* TODO GL_BLEND */
-} DRWState;
-
-typedef struct DRWPass {
-       ListBase batches;
-       DRWState state;
-} DRWPass;
-
 struct GPUFrameBuffer;
+struct GPUShader;
+struct GPUTexture;
 
-/* Textures */
+typedef struct DRWUniform DRWUniform;
+typedef struct DRWInterface DRWInterface;
+typedef struct DRWPass DRWPass;
+typedef struct DRWBatch DRWBatch;
 
+/* Textures */
 struct GPUTexture *DRW_texture_create_2D_array(int w, int h, int d, const 
float *fpixels);
+void DRW_texture_free(struct GPUTexture *tex);
 
-/* Shaders */
-struct GPUShader *DRW_shader_create(const char *vert, const char *geom, const 
char *frag, const char *defines);
-struct GPUShader *DRW_shader_create_2D(const char *frag, const char *defines);
-struct GPUShader *DRW_shader_create_3D(const char *frag, const char *defines);
-struct GPUShader *DRW_shader_create_3D_depth_only(void);
-
-struct DRWInterface *DRW_interface_create(struct GPUShader

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to