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>2017-02-08 23:44:13 +0300
committerClément Foucault <foucault.clem@gmail.com>2017-02-09 13:25:51 +0300
commit6b372e3a22cbcdcb17a6239238189d6659418516 (patch)
treea756faafc16547d2d293e643634d22fa7a8075ac /source/blender/gpu
parent09af91e0966afadd986a5a480e626698b2029826 (diff)
Clay Engine: support for overrides (not working yet)
Diffstat (limited to 'source/blender/gpu')
-rw-r--r--source/blender/gpu/GPU_viewport.h9
-rw-r--r--source/blender/gpu/intern/gpu_viewport.c33
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 ********************/