[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