[Bf-blender-cvs] [6f2c9ea3e13] blender2.8: bf_gpu: Add GPU_state module.

Ray Molenkamp noreply at git.blender.org
Tue Jun 26 23:17:43 CEST 2018


Commit: 6f2c9ea3e13248d146816910369983c5265bc968
Author: Ray Molenkamp
Date:   Tue Jun 26 15:17:31 2018 -0600
Branches: blender2.8
https://developer.blender.org/rB6f2c9ea3e13248d146816910369983c5265bc968

bf_gpu: Add GPU_state module.

This has wrappers for the most common gl* functions in the codebase, and is in preparation for D3502

Reviewers: brecht, fclem

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

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

M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/GPU_framebuffer.h
A	source/blender/gpu/GPU_state.h
M	source/blender/gpu/GPU_texture.h
M	source/blender/gpu/intern/gpu_framebuffer.c
A	source/blender/gpu/intern/gpu_state.c
M	source/blender/gpu/intern/gpu_texture.c

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

diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index 6829a8c0be2..e51b6e1b2ab 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -76,6 +76,7 @@ set(SRC
 	intern/gpu_select_pick.c
 	intern/gpu_select_sample_query.c
 	intern/gpu_shader.c
+	intern/gpu_state.c
 	intern/gpu_texture.c
 	intern/gpu_uniformbuffer.c
 	intern/gpu_viewport.c
@@ -117,6 +118,7 @@ set(SRC
 	GPU_matrix.h
 	GPU_select.h
 	GPU_shader.h
+	GPU_state.h
 	GPU_texture.h
 	GPU_uniformbuffer.h
 	GPU_viewport.h
diff --git a/source/blender/gpu/GPU_framebuffer.h b/source/blender/gpu/GPU_framebuffer.h
index 61dd899f3d9..084ee4c0459 100644
--- a/source/blender/gpu/GPU_framebuffer.h
+++ b/source/blender/gpu/GPU_framebuffer.h
@@ -194,6 +194,9 @@ void GPU_offscreen_viewport_data_get(
         GPUOffScreen *ofs,
         GPUFrameBuffer **r_fb, struct GPUTexture **r_color, struct GPUTexture **r_depth);
 
+void GPU_clear_color(float red, float green, float blue, float alpha);
+void GPU_clear(GPUFrameBufferBits flags);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/gpu/GPU_state.h b/source/blender/gpu/GPU_state.h
new file mode 100644
index 00000000000..ee0216422b1
--- /dev/null
+++ b/source/blender/gpu/GPU_state.h
@@ -0,0 +1,61 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Ray Molenkamp
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file GPU_state.h
+ *  \ingroup gpu
+ */
+
+#ifndef __GPU_STATE_H__
+#define __GPU_STATE_H__
+
+ /* These map directly to the GL_ blend functions, to minimize API add as needed*/
+typedef enum GPUBlendFunction {
+	GPU_ONE,
+	GPU_SRC_ALPHA,
+	GPU_ONE_MINUS_SRC_ALPHA,
+	GPU_DST_COLOR,
+	GPU_ZERO,
+} GPUBlendFunction;
+
+/* These map directly to the GL_ filter functions, to minimize API add as needed*/
+typedef enum GPUFilterFunction {
+	GPU_NEAREST,
+	GPU_LINEAR
+} GPUFilterFunction;
+
+void GPU_blend(bool enable);
+void GPU_blend_set_func(GPUBlendFunction sfactor, GPUBlendFunction dfactor);
+void GPU_blend_set_func_separate(GPUBlendFunction src_rgb, GPUBlendFunction dst_rgb, GPUBlendFunction src_alpha, GPUBlendFunction dst_alpha);
+void GPU_depth_test(bool enable);
+bool GPU_depth_test_enabled(void);
+void GPU_line_smooth(bool enable);
+void GPU_line_stipple(bool enable);
+void GPU_line_width(float width);
+void GPU_point_size(float size);
+void GPU_polygon_smooth(bool enable);
+void GPU_scissor(int x, int y, int width, int height);
+void GPU_scissor_getf(float coords[4]);
+void GPU_scissor_geti(int coords[4]);
+void GPU_viewport_size_getf(float coords[4]);
+void GPU_viewport_size_geti(int coords[4]);
+
+#endif  /* __GPU_STATE_H__ */
diff --git a/source/blender/gpu/GPU_texture.h b/source/blender/gpu/GPU_texture.h
index 07880df9dc0..341abeba72f 100644
--- a/source/blender/gpu/GPU_texture.h
+++ b/source/blender/gpu/GPU_texture.h
@@ -32,6 +32,8 @@
 #ifndef __GPU_TEXTURE_H__
 #define __GPU_TEXTURE_H__
 
+#include "GPU_state.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -142,19 +144,6 @@ typedef enum GPUTextureFormat {
 	GPU_DEPTH_COMPONENT16,
 } GPUTextureFormat;
 
-/* These map directly to the GL_ blend functions, to minimize API add as needed*/
-typedef enum GPUBlendFunction {
-	GPU_ONE,
-	GPU_SRC_ALPHA,
-	GPU_ONE_MINUS_SRC_ALPHA
-} GPUBlendFunction;
-
-/* These map directly to the GL_ filter functions, to minimize API add as needed*/
-typedef enum GPUFilterFunction {
-	GPU_NEAREST,
-	GPU_LINEAR
-} GPUFilterFunction;
-
 unsigned int GPU_texture_memory_usage_get(void);
 
 GPUTexture *GPU_texture_create_1D(
@@ -221,10 +210,6 @@ bool GPU_texture_stencil(const GPUTexture *tex);
 bool GPU_texture_integer(const GPUTexture *tex);
 int GPU_texture_opengl_bindcode(const GPUTexture *tex);
 
-void GPU_blend(bool enable);
-void GPU_blend_set_func_separate(GPUBlendFunction src_rgb, GPUBlendFunction dst_rgb, GPUBlendFunction src_alpha, GPUBlendFunction dst_alpha);
-void GPU_blend_set_func(GPUBlendFunction sfactor, GPUBlendFunction dfactor);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/gpu/intern/gpu_framebuffer.c b/source/blender/gpu/intern/gpu_framebuffer.c
index 18f8c33c3ca..eabd501f1d5 100644
--- a/source/blender/gpu/intern/gpu_framebuffer.c
+++ b/source/blender/gpu/intern/gpu_framebuffer.c
@@ -834,3 +834,13 @@ void GPU_offscreen_viewport_data_get(
 	*r_color = ofs->color;
 	*r_depth = ofs->depth;
 }
+
+void GPU_clear_color(float red, float green, float blue, float alpha)
+{
+	glClearColor(red, green, blue, alpha);
+}
+
+void GPU_clear(GPUFrameBufferBits flags)
+{
+	glClear(convert_buffer_bits_to_gl(flags));
+}
diff --git a/source/blender/gpu/intern/gpu_state.c b/source/blender/gpu/intern/gpu_state.c
new file mode 100644
index 00000000000..1cd531fee30
--- /dev/null
+++ b/source/blender/gpu/intern/gpu_state.c
@@ -0,0 +1,150 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Ray Molenkamp
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/gpu/intern/gpu_state.c
+ *  \ingroup gpu
+ *
+ */
+
+#include "GPU_glew.h"
+#include "GPU_state.h"
+
+static GLenum gpu_get_gl_blendfunction(GPUBlendFunction blend)
+{
+	switch (blend)
+	{
+	case GPU_ONE:
+		return GL_ONE;
+	case GPU_SRC_ALPHA:
+		return GL_SRC_ALPHA;
+	case GPU_ONE_MINUS_SRC_ALPHA:
+		return GL_ONE_MINUS_SRC_ALPHA;
+	default:
+		BLI_assert(!"Unhandled blend mode");
+		return GL_ZERO;
+	}
+}
+
+void GPU_blend(bool enable)
+{
+	if (enable) {
+		glEnable(GL_BLEND);
+	}
+	else {
+		glDisable(GL_BLEND);
+	}
+}
+
+void GPU_blend_set_func(GPUBlendFunction sfactor, GPUBlendFunction dfactor)
+{
+	glBlendFunc(gpu_get_gl_blendfunction(sfactor), gpu_get_gl_blendfunction(dfactor));
+}
+
+void GPU_blend_set_func_separate(
+	GPUBlendFunction src_rgb, GPUBlendFunction dst_rgb,
+	GPUBlendFunction src_alpha, GPUBlendFunction dst_alpha)
+{
+	glBlendFuncSeparate(gpu_get_gl_blendfunction(src_rgb),
+		gpu_get_gl_blendfunction(dst_rgb),
+		gpu_get_gl_blendfunction(src_alpha),
+		gpu_get_gl_blendfunction(dst_alpha));
+}
+
+void GPU_depth_test(bool enable)
+{
+	if (enable) {
+		glEnable(GL_DEPTH_TEST);
+	}
+	else {
+		glDisable(GL_DEPTH_TEST);
+	}
+}
+
+bool GPU_depth_test_enabled()
+{
+	return glIsEnabled(GL_DEPTH_TEST);
+}
+
+void GPU_line_smooth(bool enable)
+{
+	if (enable) {
+		glEnable(GL_LINE_SMOOTH);
+	}
+	else {
+		glDisable(GL_LINE_SMOOTH);
+	}
+}
+
+void GPU_line_stipple(bool enable)
+{
+	if (enable) {
+		glEnable(GL_LINE_STIPPLE);
+	}
+	else {
+		glDisable(GL_LINE_STIPPLE);
+	}
+}
+
+void GPU_line_width(float width)
+{
+	glLineWidth(width);
+}
+
+void GPU_point_size(float size)
+{
+	glPointSize(size);
+}
+
+void GPU_polygon_smooth(bool enable)
+{
+	if (enable) {
+		glEnable(GL_POLYGON_SMOOTH);
+	}
+	else {
+		glDisable(GL_POLYGON_SMOOTH);
+	}
+}
+
+void GPU_scissor(int x, int y, int width, int height)
+{
+	glScissor(x, y, width, height);
+}
+
+void GPU_scissor_getf(float coords[4])
+{
+	glGetFloatv(GL_SCISSOR_BOX, coords);
+}
+
+void GPU_scissor_geti(int coords[4])
+{
+	glGetIntegerv(GL_SCISSOR_BOX, coords);
+}
+
+void GPU_viewport_size_getf(float coords[4])
+{
+	glGetFloatv(GL_VIEWPORT, coords);
+}
+
+void GPU_viewport_size_geti(int coords[4])
+{
+	glGetIntegerv(GL_VIEWPORT, coords);
+}
diff --git a/source/blender/gpu/intern/gpu_texture.c b/source/blender/gpu/intern/gpu_texture.c
index 21a3aee5f57..ae037ca442e 100644
--- a/source/blender/gpu/intern/gpu_texture.c
+++ b/source/blender/gpu/intern/gpu_texture.c
@@ -1260,43 +1260,3 @@ int GPU_texture_detach_framebuffer(GPUTexture *tex, GPUFrameBuffer *fb)
 	BLI_assert(!"Error: Texture: Framebuffer is not attached");
 	return 0;
 }
-
-void GPU_blend(bool enable)
-{
-	if (enable) {
-		glEnable(GL_BLEND);
-	}
-	else {
-		glDisable(GL_BLEND);
-	}
-}
-
-static GLenum gpu_get_gl_blendfunction(GPUBlendFunction blend)
-{
-	switch (blend) {
-		case GPU_ONE:
-			return GL_ONE;
-		case GPU_SRC_ALPHA:
-			return GL_SRC_ALPHA;
-		case GPU_ONE_MINUS_SRC_ALPHA:
-			return GL_ONE_MINUS_SRC_ALPHA;
-		default:
-			BLI_assert(!"Unhandled blend mode");
-			return GL_ZERO;
-	}
-}
-
-void GPU_blend_set_func_separate(
-        GPUBlendFunction src_rgb, GPUBlendFunction dst_rgb,
-        GPUBlendFunction src_alpha, GPUBlendFunction dst_alpha)
-{
-	glBlendFuncSeparate(gpu_get_gl_blendfunction(src_rgb),
-		gpu_get_gl_blendfunction(dst_rgb),
-		gpu_get_gl_blendfunction(src_alpha),
-		gpu_get_gl_blendfunction(dst_alpha));
-}
-
-void GPU_blend_set_func(GPUBlendFunction sfactor, GPUBlendFunction dfactor)
-{
-	glBlendFunc(gpu_get_gl_blendfunction(sfactor), gpu_get_gl_blendfunction(dfactor));
-}



More information about the Bf-blender-cvs mailing list