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
This commit is contained in:
Ray Molenkamp
2018-06-26 15:17:31 -06:00
parent a61480c271
commit 6f2c9ea3e1
7 changed files with 228 additions and 57 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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__ */

View File

@@ -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

View File

@@ -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));
}

View File

@@ -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);
}

View File

@@ -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));
}