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>2020-09-03 22:52:30 +0300
committerClément Foucault <foucault.clem@gmail.com>2020-09-05 18:49:14 +0300
commitdb21c12abedd7606a3aaf50f70e506a24d9f0e7a (patch)
tree31b928b9a14f8b801a1d792c5dcd1825855b30b7 /source/blender
parent22a84a673a9fd9942b54a584cbbbab5d0861cbd5 (diff)
GPUFramebuffer: Encapsulate single attachement clear
This is in preparation of using it to clear single texture. Also includes minor cleanups about not using tex target in assert and adding enum operators.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/gpu/GPU_framebuffer.h14
-rw-r--r--source/blender/gpu/intern/gpu_framebuffer.cc5
-rw-r--r--source/blender/gpu/intern/gpu_framebuffer_private.hh3
-rw-r--r--source/blender/gpu/opengl/gl_framebuffer.cc49
-rw-r--r--source/blender/gpu/opengl/gl_framebuffer.hh3
5 files changed, 60 insertions, 14 deletions
diff --git a/source/blender/gpu/GPU_framebuffer.h b/source/blender/gpu/GPU_framebuffer.h
index aca7156fa5b..f4599ac44bb 100644
--- a/source/blender/gpu/GPU_framebuffer.h
+++ b/source/blender/gpu/GPU_framebuffer.h
@@ -32,6 +32,14 @@
#include "GPU_texture.h"
+typedef enum eGPUFrameBufferBits {
+ GPU_COLOR_BIT = (1 << 0),
+ GPU_DEPTH_BIT = (1 << 1),
+ GPU_STENCIL_BIT = (1 << 2),
+} eGPUFrameBufferBits;
+
+ENUM_OPERATORS(eGPUFrameBufferBits)
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -41,12 +49,6 @@ typedef struct GPUAttachment {
int layer, mip;
} GPUAttachment;
-typedef enum eGPUFrameBufferBits {
- GPU_COLOR_BIT = (1 << 0),
- GPU_DEPTH_BIT = (1 << 1),
- GPU_STENCIL_BIT = (1 << 2),
-} eGPUFrameBufferBits;
-
typedef enum eGPUBackBuffer {
GPU_BACKBUFFER_LEFT = 0,
GPU_BACKBUFFER_RIGHT,
diff --git a/source/blender/gpu/intern/gpu_framebuffer.cc b/source/blender/gpu/intern/gpu_framebuffer.cc
index bb17ee8edf4..742fdc6d8b3 100644
--- a/source/blender/gpu/intern/gpu_framebuffer.cc
+++ b/source/blender/gpu/intern/gpu_framebuffer.cc
@@ -96,10 +96,7 @@ void FrameBuffer::attachment_set(GPUAttachmentType type, const GPUAttachment &ne
if (new_attachment.tex) {
if (new_attachment.layer > 0) {
- BLI_assert(ELEM(GPU_texture_target(new_attachment.tex),
- GL_TEXTURE_2D_ARRAY,
- GL_TEXTURE_CUBE_MAP,
- GL_TEXTURE_CUBE_MAP_ARRAY_ARB));
+ BLI_assert(GPU_texture_cube(new_attachment.tex) || GPU_texture_array(new_attachment.tex));
}
if (GPU_texture_stencil(new_attachment.tex)) {
BLI_assert(ELEM(type, GPU_FB_DEPTH_STENCIL_ATTACHMENT));
diff --git a/source/blender/gpu/intern/gpu_framebuffer_private.hh b/source/blender/gpu/intern/gpu_framebuffer_private.hh
index 0f442ff2b34..58ee841c076 100644
--- a/source/blender/gpu/intern/gpu_framebuffer_private.hh
+++ b/source/blender/gpu/intern/gpu_framebuffer_private.hh
@@ -115,6 +115,9 @@ class FrameBuffer {
float clear_depth,
uint clear_stencil) = 0;
virtual void clear_multi(const float (*clear_col)[4]) = 0;
+ virtual void clear_attachment(GPUAttachmentType type,
+ eGPUDataFormat data_format,
+ const void *clear_value) = 0;
virtual void read(eGPUFrameBufferBits planes,
eGPUDataFormat format,
diff --git a/source/blender/gpu/opengl/gl_framebuffer.cc b/source/blender/gpu/opengl/gl_framebuffer.cc
index 133d56a075d..4be471b236a 100644
--- a/source/blender/gpu/opengl/gl_framebuffer.cc
+++ b/source/blender/gpu/opengl/gl_framebuffer.cc
@@ -356,7 +356,9 @@ void GLFrameBuffer::clear(eGPUFrameBufferBits buffers,
}
}
-void GLFrameBuffer::clear_multi(const float (*clear_cols)[4])
+void GLFrameBuffer::clear_attachment(GPUAttachmentType type,
+ eGPUDataFormat data_format,
+ const void *clear_value)
{
BLI_assert(GPU_context_active_get() == context_);
BLI_assert(context_->active_fb == this);
@@ -367,17 +369,56 @@ void GLFrameBuffer::clear_multi(const float (*clear_cols)[4])
context_->state_manager->apply_state();
+ if (type == GPU_FB_DEPTH_STENCIL_ATTACHMENT) {
+ BLI_assert(data_format == GPU_DATA_UNSIGNED_INT_24_8);
+ float depth = ((*(uint32_t *)clear_value) & 0x00FFFFFFu) / (float)0x00FFFFFFu;
+ int stencil = ((*(uint32_t *)clear_value) >> 24);
+ glClearBufferfi(GL_DEPTH_STENCIL, 0, depth, stencil);
+ }
+ else if (type == GPU_FB_DEPTH_ATTACHMENT) {
+ if (data_format == GPU_DATA_FLOAT) {
+ glClearBufferfv(GL_DEPTH, 0, (GLfloat *)clear_value);
+ }
+ else if (data_format == GPU_DATA_UNSIGNED_INT) {
+ float depth = *(uint32_t *)clear_value / (float)0xFFFFFFFFu;
+ glClearBufferfv(GL_DEPTH, 0, &depth);
+ }
+ else {
+ BLI_assert(!"Unhandled data format");
+ }
+ }
+ else {
+ int slot = type - GPU_FB_COLOR_ATTACHMENT0;
+ switch (data_format) {
+ case GPU_DATA_FLOAT:
+ glClearBufferfv(GL_COLOR, slot, (GLfloat *)clear_value);
+ break;
+ case GPU_DATA_UNSIGNED_INT:
+ glClearBufferuiv(GL_COLOR, slot, (GLuint *)clear_value);
+ break;
+ case GPU_DATA_INT:
+ glClearBufferiv(GL_COLOR, slot, (GLint *)clear_value);
+ break;
+ default:
+ BLI_assert(!"Unhandled data format");
+ break;
+ }
+ }
+
+ GPU_write_mask(write_mask);
+}
+
+void GLFrameBuffer::clear_multi(const float (*clear_cols)[4])
+{
/* WATCH: This can easily access clear_cols out of bounds it clear_cols is not big enough for
* all attachments.
* TODO(fclem) fix this insecurity? */
int type = GPU_FB_COLOR_ATTACHMENT0;
for (int i = 0; type < GPU_FB_MAX_ATTACHMENT; i++, type++) {
if (attachments_[type].tex != NULL) {
- glClearBufferfv(GL_COLOR, i, clear_cols[i]);
+ this->clear_attachment(GPU_FB_COLOR_ATTACHMENT0 + i, GPU_DATA_FLOAT, clear_cols[i]);
}
}
-
- GPU_write_mask(write_mask);
}
void GLFrameBuffer::read(eGPUFrameBufferBits plane,
diff --git a/source/blender/gpu/opengl/gl_framebuffer.hh b/source/blender/gpu/opengl/gl_framebuffer.hh
index 8d386116159..8173d3b2416 100644
--- a/source/blender/gpu/opengl/gl_framebuffer.hh
+++ b/source/blender/gpu/opengl/gl_framebuffer.hh
@@ -81,6 +81,9 @@ class GLFrameBuffer : public FrameBuffer {
float clear_depth,
uint clear_stencil) override;
void clear_multi(const float (*clear_cols)[4]) override;
+ void clear_attachment(GPUAttachmentType type,
+ eGPUDataFormat data_format,
+ const void *clear_value) override;
void read(eGPUFrameBufferBits planes,
eGPUDataFormat format,