diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-02-08 23:44:13 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-02-09 13:25:51 +0300 |
commit | 6b372e3a22cbcdcb17a6239238189d6659418516 (patch) | |
tree | a756faafc16547d2d293e643634d22fa7a8075ac /source/blender/gpu | |
parent | 09af91e0966afadd986a5a480e626698b2029826 (diff) |
Clay Engine: support for overrides (not working yet)
Diffstat (limited to 'source/blender/gpu')
-rw-r--r-- | source/blender/gpu/GPU_viewport.h | 9 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_viewport.c | 33 |
2 files changed, 38 insertions, 4 deletions
diff --git a/source/blender/gpu/GPU_viewport.h b/source/blender/gpu/GPU_viewport.h index e44657a4647..9de16f64ca1 100644 --- a/source/blender/gpu/GPU_viewport.h +++ b/source/blender/gpu/GPU_viewport.h @@ -44,6 +44,7 @@ typedef struct GPUViewport GPUViewport; #define MAX_BUFFERS 8 #define MAX_TEXTURES 16 #define MAX_PASSES 16 +#define MAX_STORAGE 2 /* extend if needed */ /* All FramebufferLists are just the same pointers with different names */ typedef struct FramebufferList { @@ -58,6 +59,10 @@ typedef struct PassList { struct DRWPass *passes[MAX_TEXTURES]; } PassList; +typedef struct StorageList { + void *storage[MAX_STORAGE]; /* custom structs from the engine */ +} StorageList; + /* Buffer and textures used by the viewport by default */ typedef struct DefaultFramebufferList { struct GPUFrameBuffer *default_fb; @@ -74,11 +79,11 @@ typedef struct DefaultPassList { } DefaultPassList; GPUViewport *GPU_viewport_create(void); -void GPU_viewport_bind(GPUViewport *viewport, const rcti *rect); +void GPU_viewport_bind(GPUViewport *viewport, const rcti *rect, const char *engine); void GPU_viewport_unbind(GPUViewport *viewport); void GPU_viewport_free(GPUViewport *viewport); -void GPU_viewport_get_engine_data(GPUViewport *viewport, void **fbs, void **txs, void **pss); +void GPU_viewport_get_engine_data(GPUViewport *viewport, void **fbs, void **txs, void **pss, void **str); /* debug */ bool GPU_viewport_debug_depth_create(GPUViewport *viewport, int width, int height, char err_out[256]); diff --git a/source/blender/gpu/intern/gpu_viewport.c b/source/blender/gpu/intern/gpu_viewport.c index b1964857ab1..62ba06b7a0a 100644 --- a/source/blender/gpu/intern/gpu_viewport.c +++ b/source/blender/gpu/intern/gpu_viewport.c @@ -34,6 +34,7 @@ #include <string.h> #include "BLI_rect.h" +#include "BLI_string.h" #include "DNA_vec_types.h" @@ -59,10 +60,14 @@ struct GPUViewport { DefaultFramebufferList *fbl; DefaultTextureList *txl; DefaultPassList *psl; + StorageList *stl; + + char engine_name[32]; }; static void GPU_viewport_buffers_free(GPUViewport *viewport); static void GPU_viewport_passes_free(GPUViewport *viewport); +static void GPU_viewport_storage_free(GPUViewport *viewport); GPUViewport *GPU_viewport_create(void) { @@ -70,19 +75,21 @@ GPUViewport *GPU_viewport_create(void) viewport->fbl = MEM_callocN(sizeof(FramebufferList), "FramebufferList"); viewport->txl = MEM_callocN(sizeof(TextureList), "TextureList"); viewport->psl = MEM_callocN(sizeof(PassList), "PassList"); + viewport->stl = MEM_callocN(sizeof(StorageList), "StorageList"); viewport->size[0] = viewport->size[1] = -1; return viewport; } -void GPU_viewport_get_engine_data(GPUViewport *viewport, void **fbs, void **txs, void **pss) +void GPU_viewport_get_engine_data(GPUViewport *viewport, void **fbs, void **txs, void **pss, void **str) { *fbs = viewport->fbl; *txs = viewport->txl; *pss = viewport->psl; + *str = viewport->stl; } -void GPU_viewport_bind(GPUViewport *viewport, const rcti *rect) +void GPU_viewport_bind(GPUViewport *viewport, const rcti *rect, const char *engine) { /* add one pixel because of scissor test */ int rect_w = BLI_rcti_size_x(rect) + 1, rect_h = BLI_rcti_size_y(rect) + 1; @@ -92,6 +99,13 @@ void GPU_viewport_bind(GPUViewport *viewport, const rcti *rect) GPU_viewport_passes_free(viewport); #endif + if (!STREQ(engine, viewport->engine_name)) { + GPU_viewport_storage_free(viewport); + GPU_viewport_buffers_free(viewport); + + BLI_strncpy(viewport->engine_name, engine, 32); + } + if (viewport->fbl->default_fb) { if (rect_w != viewport->size[0] || rect_h != viewport->size[1]) { GPU_viewport_buffers_free(viewport); @@ -222,6 +236,19 @@ static void GPU_viewport_buffers_free(GPUViewport *viewport) } } +static void GPU_viewport_storage_free(GPUViewport *viewport) +{ + StorageList *stl = (StorageList *)viewport->stl; + + for (int i = MAX_STORAGE - 1; i > -1; --i) { + void *storage = stl->storage[i]; + if (storage) { + MEM_freeN(storage); + stl->storage[i] = NULL; + } + } +} + static void GPU_viewport_passes_free(GPUViewport *viewport) { PassList *psl = (PassList *)viewport->psl; @@ -242,10 +269,12 @@ void GPU_viewport_free(GPUViewport *viewport) GPU_viewport_debug_depth_free(viewport); GPU_viewport_buffers_free(viewport); GPU_viewport_passes_free(viewport); + GPU_viewport_storage_free(viewport); MEM_freeN(viewport->fbl); MEM_freeN(viewport->txl); MEM_freeN(viewport->psl); + MEM_freeN(viewport->stl); } /****************** debug ********************/ |