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:
@@ -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
|
||||
|
@@ -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
|
||||
|
61
source/blender/gpu/GPU_state.h
Normal file
61
source/blender/gpu/GPU_state.h
Normal 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__ */
|
@@ -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
|
||||
|
@@ -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));
|
||||
}
|
||||
|
150
source/blender/gpu/intern/gpu_state.c
Normal file
150
source/blender/gpu/intern/gpu_state.c
Normal 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);
|
||||
}
|
@@ -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));
|
||||
}
|
||||
|
Reference in New Issue
Block a user