[Bf-blender-cvs] [4430e8a0081] master: Python: gpu module: add new submodules and types

Germano Cavalcante noreply at git.blender.org
Wed Feb 17 16:40:45 CET 2021


Commit: 4430e8a00810ca8df2fa20029c4cb8078e8cdbe6
Author: Germano Cavalcante
Date:   Wed Feb 17 10:48:08 2021 -0300
Branches: master
https://developer.blender.org/rB4430e8a00810ca8df2fa20029c4cb8078e8cdbe6

Python: gpu module: add new submodules and types

This commit extends the gpu python API with:
```
gpu.types.Buffer         #"__init__", "to_list"
gpu.types.GPUTexture     #"__init__", "clear", "read", "format"
gpu.types.GPUFrameBuffer #"__init__", "bind", "clear", "is_bound", "viewport", ("__enter__",  "__exit__" with "GPUFrameBufferStackContext")
gpu.types.GPUUniformBuf  #"__init__", "update"
gpu.state                #"blend_set",  "blend_get",  "depth_test_set",  "depth_test_get",  "depth_mask_set",  "depth_mask_get",  "viewport_set",  "viewport_get",  "line_width_set",  "line_width_get",  "point_size_set",  "color_mask_set",  "face_culling_set", "front_facing_set",  "program_point_size_set"
```

Add these methods to existing objects:
```
gpu.types.GPUShader  #"uniform_sample", "uniform_buffer"
```

Maniphest Tasks: T80481

Differential Revision: https://developer.blender.org/D8826

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

M	source/blender/gpu/GPU_framebuffer.h
M	source/blender/gpu/GPU_texture.h
M	source/blender/gpu/intern/gpu_framebuffer.cc
M	source/blender/gpu/intern/gpu_texture.cc
M	source/blender/gpu/intern/gpu_texture_private.hh
M	source/blender/python/generic/py_capi_utils.c
M	source/blender/python/generic/py_capi_utils.h
M	source/blender/python/gpu/CMakeLists.txt
A	source/blender/python/gpu/gpu_py.c
A	source/blender/python/gpu/gpu_py.h
M	source/blender/python/gpu/gpu_py_api.c
M	source/blender/python/gpu/gpu_py_api.h
A	source/blender/python/gpu/gpu_py_buffer.c
A	source/blender/python/gpu/gpu_py_buffer.h
A	source/blender/python/gpu/gpu_py_framebuffer.c
A	source/blender/python/gpu/gpu_py_framebuffer.h
M	source/blender/python/gpu/gpu_py_offscreen.c
M	source/blender/python/gpu/gpu_py_offscreen.h
M	source/blender/python/gpu/gpu_py_shader.c
A	source/blender/python/gpu/gpu_py_state.c
A	source/blender/python/gpu/gpu_py_state.h
A	source/blender/python/gpu/gpu_py_texture.c
A	source/blender/python/gpu/gpu_py_texture.h
M	source/blender/python/gpu/gpu_py_types.c
M	source/blender/python/gpu/gpu_py_types.h
A	source/blender/python/gpu/gpu_py_uniformbuffer.c
A	source/blender/python/gpu/gpu_py_uniformbuffer.h

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

diff --git a/source/blender/gpu/GPU_framebuffer.h b/source/blender/gpu/GPU_framebuffer.h
index 8c6592adf6d..af94c1fb0e6 100644
--- a/source/blender/gpu/GPU_framebuffer.h
+++ b/source/blender/gpu/GPU_framebuffer.h
@@ -209,6 +209,10 @@ void GPU_framebuffer_recursive_downsample(GPUFrameBuffer *fb,
                                           void (*callback)(void *userData, int level),
                                           void *userData);
 
+void GPU_framebuffer_push(GPUFrameBuffer *fb);
+GPUFrameBuffer *GPU_framebuffer_pop(void);
+uint GPU_framebuffer_stack_level_get(void);
+
 /* GPU OffScreen
  * - wrapper around frame-buffer and texture for simple off-screen drawing
  */
diff --git a/source/blender/gpu/GPU_texture.h b/source/blender/gpu/GPU_texture.h
index da2d2639440..176d7bbb5af 100644
--- a/source/blender/gpu/GPU_texture.h
+++ b/source/blender/gpu/GPU_texture.h
@@ -272,6 +272,10 @@ int GPU_texture_opengl_bindcode(const GPUTexture *tex);
 
 void GPU_texture_get_mipmap_size(GPUTexture *tex, int lvl, int *size);
 
+/* utilities */
+size_t GPU_texture_component_len(eGPUTextureFormat format);
+size_t GPU_texture_dataformat_size(eGPUDataFormat data_format);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/gpu/intern/gpu_framebuffer.cc b/source/blender/gpu/intern/gpu_framebuffer.cc
index 2e183f52eea..2813132c799 100644
--- a/source/blender/gpu/intern/gpu_framebuffer.cc
+++ b/source/blender/gpu/intern/gpu_framebuffer.cc
@@ -476,10 +476,9 @@ void GPU_framebuffer_recursive_downsample(GPUFrameBuffer *gpu_fb,
 /** \} */
 
 /* -------------------------------------------------------------------- */
-/** \name GPUOffScreen
+/** \name  Framebuffer Stack
  *
- * Container that holds a frame-buffer and its textures.
- * Might be bound to multiple contexts.
+ * Keeps track of framebuffer binding operation to restore previously bound frambuffers.
  * \{ */
 
 #define FRAMEBUFFER_STACK_DEPTH 16
@@ -489,22 +488,36 @@ static struct {
   uint top;
 } FrameBufferStack = {{nullptr}};
 
-static void gpuPushFrameBuffer(GPUFrameBuffer *fb)
+void GPU_framebuffer_push(GPUFrameBuffer *fb)
 {
   BLI_assert(FrameBufferStack.top < FRAMEBUFFER_STACK_DEPTH);
   FrameBufferStack.framebuffers[FrameBufferStack.top] = fb;
   FrameBufferStack.top++;
 }
 
-static GPUFrameBuffer *gpuPopFrameBuffer()
+GPUFrameBuffer *GPU_framebuffer_pop(void)
 {
   BLI_assert(FrameBufferStack.top > 0);
   FrameBufferStack.top--;
   return FrameBufferStack.framebuffers[FrameBufferStack.top];
 }
 
+uint GPU_framebuffer_stack_level_get(void)
+{
+  return FrameBufferStack.top;
+}
+
 #undef FRAMEBUFFER_STACK_DEPTH
 
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name GPUOffScreen
+ *
+ * Container that holds a frame-buffer and its textures.
+ * Might be bound to multiple contexts.
+ * \{ */
+
 #define MAX_CTX_FB_LEN 3
 
 struct GPUOffScreen {
@@ -614,7 +627,7 @@ void GPU_offscreen_bind(GPUOffScreen *ofs, bool save)
 {
   if (save) {
     GPUFrameBuffer *fb = GPU_framebuffer_active_get();
-    gpuPushFrameBuffer(fb);
+    GPU_framebuffer_push(fb);
   }
   unwrap(gpu_offscreen_fb_get(ofs))->bind(false);
 }
@@ -623,7 +636,7 @@ void GPU_offscreen_unbind(GPUOffScreen *UNUSED(ofs), bool restore)
 {
   GPUFrameBuffer *fb = nullptr;
   if (restore) {
-    fb = gpuPopFrameBuffer();
+    fb = GPU_framebuffer_pop();
   }
 
   if (fb) {
diff --git a/source/blender/gpu/intern/gpu_texture.cc b/source/blender/gpu/intern/gpu_texture.cc
index d134d718cbe..2b83b3bc28c 100644
--- a/source/blender/gpu/intern/gpu_texture.cc
+++ b/source/blender/gpu/intern/gpu_texture.cc
@@ -608,3 +608,20 @@ void GPU_samplers_update(void)
 }
 
 /** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name GPU texture utilities
+ *
+ * \{ */
+
+size_t GPU_texture_component_len(eGPUTextureFormat tex_format)
+{
+  return to_component_len(tex_format);
+}
+
+size_t GPU_texture_dataformat_size(eGPUDataFormat data_format)
+{
+  return to_bytesize(data_format);
+}
+
+/** \} */
diff --git a/source/blender/gpu/intern/gpu_texture_private.hh b/source/blender/gpu/intern/gpu_texture_private.hh
index 400a36559da..51a953e110d 100644
--- a/source/blender/gpu/intern/gpu_texture_private.hh
+++ b/source/blender/gpu/intern/gpu_texture_private.hh
@@ -384,15 +384,15 @@ inline int to_component_len(eGPUTextureFormat format)
   }
 }
 
-inline size_t to_bytesize(eGPUTextureFormat tex_format, eGPUDataFormat data_format)
+inline size_t to_bytesize(eGPUDataFormat data_format)
 {
   switch (data_format) {
     case GPU_DATA_UNSIGNED_BYTE:
-      return 1 * to_component_len(tex_format);
+      return 1;
     case GPU_DATA_FLOAT:
     case GPU_DATA_INT:
     case GPU_DATA_UNSIGNED_INT:
-      return 4 * to_component_len(tex_format);
+      return 4;
     case GPU_DATA_UNSIGNED_INT_24_8:
     case GPU_DATA_10_11_11_REV:
       return 4;
@@ -402,6 +402,11 @@ inline size_t to_bytesize(eGPUTextureFormat tex_format, eGPUDataFormat data_form
   }
 }
 
+inline size_t to_bytesize(eGPUTextureFormat tex_format, eGPUDataFormat data_format)
+{
+  return to_component_len(tex_format) * to_bytesize(data_format);
+}
+
 /* Definitely not complete, edit according to the gl specification. */
 inline bool validate_data_format(eGPUTextureFormat tex_format, eGPUDataFormat data_format)
 {
diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c
index c7ce264f2f9..351ba884d49 100644
--- a/source/blender/python/generic/py_capi_utils.c
+++ b/source/blender/python/generic/py_capi_utils.c
@@ -282,6 +282,17 @@ int PyC_ParseStringEnum(PyObject *o, void *p)
   return 0;
 }
 
+const char *PyC_StringEnum_FindIDFromValue(const struct PyC_StringEnumItems *items,
+                                           const int value)
+{
+  for (int i = 0; items[i].id; i++) {
+    if (items[i].value == value) {
+      return items[i].id;
+    }
+  }
+  return NULL;
+}
+
 /* silly function, we dont use arg. just check its compatible with __deepcopy__ */
 int PyC_CheckArgs_DeepCopy(PyObject *args)
 {
diff --git a/source/blender/python/generic/py_capi_utils.h b/source/blender/python/generic/py_capi_utils.h
index aacc5dd7bea..842e1482c06 100644
--- a/source/blender/python/generic/py_capi_utils.h
+++ b/source/blender/python/generic/py_capi_utils.h
@@ -140,6 +140,8 @@ struct PyC_StringEnum {
 };
 
 int PyC_ParseStringEnum(PyObject *o, void *p);
+const char *PyC_StringEnum_FindIDFromValue(const struct PyC_StringEnumItems *items,
+                                           const int value);
 
 int PyC_CheckArgs_DeepCopy(PyObject *args);
 
diff --git a/source/blender/python/gpu/CMakeLists.txt b/source/blender/python/gpu/CMakeLists.txt
index 7f6fd9eefab..fe5c559fcc0 100644
--- a/source/blender/python/gpu/CMakeLists.txt
+++ b/source/blender/python/gpu/CMakeLists.txt
@@ -33,25 +33,37 @@ set(INC_SYS
 )
 
 set(SRC
+  gpu_py.c
   gpu_py_api.c
   gpu_py_batch.c
+  gpu_py_buffer.c
   gpu_py_element.c
+  gpu_py_framebuffer.c
   gpu_py_matrix.c
   gpu_py_offscreen.c
   gpu_py_select.c
   gpu_py_shader.c
+  gpu_py_state.c
+  gpu_py_texture.c
   gpu_py_types.c
+  gpu_py_uniformbuffer.c
   gpu_py_vertex_buffer.c
   gpu_py_vertex_format.c
 
+  gpu_py.h
   gpu_py_api.h
   gpu_py_batch.h
+  gpu_py_buffer.h
   gpu_py_element.h
+  gpu_py_framebuffer.h
   gpu_py_matrix.h
   gpu_py_offscreen.h
   gpu_py_select.h
   gpu_py_shader.h
+  gpu_py_state.h
+  gpu_py_texture.h
   gpu_py_types.h
+  gpu_py_uniformbuffer.h
   gpu_py_vertex_buffer.h
   gpu_py_vertex_format.h
 )
diff --git a/source/blender/python/gpu/gpu_py_offscreen.h b/source/blender/python/gpu/gpu_py.c
similarity index 55%
copy from source/blender/python/gpu/gpu_py_offscreen.h
copy to source/blender/python/gpu/gpu_py.c
index efe5b57b22e..522cd89c5c0 100644
--- a/source/blender/python/gpu/gpu_py_offscreen.h
+++ b/source/blender/python/gpu/gpu_py.c
@@ -16,19 +16,30 @@
 
 /** \file
  * \ingroup bpygpu
+ *
+ * - Use ``bpygpu_`` for local API.
+ * - Use ``BPyGPU`` for public API.
  */
 
-#pragma once
+#include <Python.h>
 
-#include "BLI_compiler_attrs.h"
+#include "GPU_texture.h"
 
-extern PyTypeObject BPyGPUOffScreen_Type;
+#include "../generic/py_capi_utils.h"
 
-#define BPyGPUOffScreen_Check(v) (Py_TYPE(v) == &BPyGPUOffScreen_Type)
+#include "gpu_py.h" /* own include */
 
-typedef struct BPyGPUOffScreen {
-  PyObject_HEAD struct GPUOffScreen *ofs;
-  bool is_saved;
-} BPyGPUOffScreen;
+/* -------------------------------------------------------------------- */
+/** \name GPU Module
+ * \{ */
 
-PyObject *BPyGPUOffScreen_CreatePyObject(struct GPUOffScreen *ofs) ATTR_NONNULL(1);
+struct PyC_StringEnumItems bpygpu_dataformat_items[] = {
+    {GPU_DATA_FLOAT, "FLOAT"},
+    {GPU_DATA_INT, "INT"},
+    {GPU_DATA_UNSIGNED_INT, "UINT"},
+    {GPU_DATA_UNSIGNED_BYTE, "UBYTE"},
+    {GPU_DATA_UNSIGNED_INT_24_8, "UINT_24_8"},
+    {GPU_DATA_10_11_11_REV, "10_11_11_REV"},
+    {0, NULL},
+};
+/** \} */
diff --git a/source/blender/python/gpu/gpu_py_types.h b/source/blender/python/gpu/gpu_py.h
similarity index 78%
copy from source/blender/python/gpu/gpu_py_types.h
copy to source/blender/python/gpu/gpu_py.h
index cf8d6d694e6..8a96391664f 100644
--- a/source/blender/python/gpu/gpu_py_types.h
+++ b/source/blender/python/gpu/gpu_py.h
@@ -20,11 +20,4 @@
 
 #pragma once
 
-#include "gpu_py_batch.h"
-#include "gpu_py_element.h"
-#include "gpu_py_offscreen.h"
-#include "gpu_py_shader.h"
-#include "gpu_py_vertex_buffer.h"
-#include "gpu_py_vertex_format.h"
-
-PyObject *bpygpu_types_init(void);
+extern struct PyC_StringEnumItems bpygpu_dataformat_items[];
diff --git a/source/blender/python/gpu/gpu_py_api.c b/source/blender/python/gpu/gpu_py_api.c
index dcc8484319e..38e9b61e147 100644
--- a/source/blender/python/gpu/gpu_py_api.c
+++ b/source/blender/python/gpu/gpu_py_api.c
@@ -35,6 +35,7 @@
 
 #include "gpu_py_matrix.h"
 #include "gpu_py_select.h"
+#include "gpu_py_state.h"
 #include "gpu_py_types.h"
 
 #include "gpu_py_api.h" /* own include */
@@ -134,6 +135,9 @@ PyObject *BPyInit_gpu(void)
   PyModule_AddObject(mod, "shader", (submodule = bpygpu_shader_init()));
   PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
 
+  PyModule_AddObject(mod, "stat

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list