diff options
author | Germano Cavalcante <germano.costa@ig.com.br> | 2021-02-17 16:48:08 +0300 |
---|---|---|
committer | Germano Cavalcante <germano.costa@ig.com.br> | 2021-02-17 18:27:19 +0300 |
commit | 4430e8a00810ca8df2fa20029c4cb8078e8cdbe6 (patch) | |
tree | acea8dc3d311f94c7cd5eabd36371bc76ec06b3f /source/blender/gpu | |
parent | ec8c09f2aafdc7c13bb27c0f74e9def83c0400c7 (diff) |
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
Diffstat (limited to 'source/blender/gpu')
-rw-r--r-- | source/blender/gpu/GPU_framebuffer.h | 4 | ||||
-rw-r--r-- | source/blender/gpu/GPU_texture.h | 4 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_framebuffer.cc | 27 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_texture.cc | 17 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_texture_private.hh | 11 |
5 files changed, 53 insertions, 10 deletions
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) { |