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
path: root/source
diff options
context:
space:
mode:
authorRay Molenkamp <github@lazydodo.com>2018-06-27 00:17:31 +0300
committerRay Molenkamp <github@lazydodo.com>2018-06-27 00:17:31 +0300
commit6f2c9ea3e13248d146816910369983c5265bc968 (patch)
tree32b779874f8116663534ab8a6602f8f139bd6360 /source
parenta61480c27103fbf449fd14ea8061b65c29f19eae (diff)
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
Diffstat (limited to 'source')
-rw-r--r--source/blender/gpu/CMakeLists.txt2
-rw-r--r--source/blender/gpu/GPU_framebuffer.h3
-rw-r--r--source/blender/gpu/GPU_state.h61
-rw-r--r--source/blender/gpu/GPU_texture.h19
-rw-r--r--source/blender/gpu/intern/gpu_framebuffer.c10
-rw-r--r--source/blender/gpu/intern/gpu_state.c150
-rw-r--r--source/blender/gpu/intern/gpu_texture.c40
7 files changed, 228 insertions, 57 deletions
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));
-}