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_pick.c
|
||||||
intern/gpu_select_sample_query.c
|
intern/gpu_select_sample_query.c
|
||||||
intern/gpu_shader.c
|
intern/gpu_shader.c
|
||||||
|
intern/gpu_state.c
|
||||||
intern/gpu_texture.c
|
intern/gpu_texture.c
|
||||||
intern/gpu_uniformbuffer.c
|
intern/gpu_uniformbuffer.c
|
||||||
intern/gpu_viewport.c
|
intern/gpu_viewport.c
|
||||||
@@ -117,6 +118,7 @@ set(SRC
|
|||||||
GPU_matrix.h
|
GPU_matrix.h
|
||||||
GPU_select.h
|
GPU_select.h
|
||||||
GPU_shader.h
|
GPU_shader.h
|
||||||
|
GPU_state.h
|
||||||
GPU_texture.h
|
GPU_texture.h
|
||||||
GPU_uniformbuffer.h
|
GPU_uniformbuffer.h
|
||||||
GPU_viewport.h
|
GPU_viewport.h
|
||||||
|
@@ -194,6 +194,9 @@ void GPU_offscreen_viewport_data_get(
|
|||||||
GPUOffScreen *ofs,
|
GPUOffScreen *ofs,
|
||||||
GPUFrameBuffer **r_fb, struct GPUTexture **r_color, struct GPUTexture **r_depth);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#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__
|
#ifndef __GPU_TEXTURE_H__
|
||||||
#define __GPU_TEXTURE_H__
|
#define __GPU_TEXTURE_H__
|
||||||
|
|
||||||
|
#include "GPU_state.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
@@ -142,19 +144,6 @@ typedef enum GPUTextureFormat {
|
|||||||
GPU_DEPTH_COMPONENT16,
|
GPU_DEPTH_COMPONENT16,
|
||||||
} GPUTextureFormat;
|
} 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);
|
unsigned int GPU_texture_memory_usage_get(void);
|
||||||
|
|
||||||
GPUTexture *GPU_texture_create_1D(
|
GPUTexture *GPU_texture_create_1D(
|
||||||
@@ -221,10 +210,6 @@ bool GPU_texture_stencil(const GPUTexture *tex);
|
|||||||
bool GPU_texture_integer(const GPUTexture *tex);
|
bool GPU_texture_integer(const GPUTexture *tex);
|
||||||
int GPU_texture_opengl_bindcode(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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -834,3 +834,13 @@ void GPU_offscreen_viewport_data_get(
|
|||||||
*r_color = ofs->color;
|
*r_color = ofs->color;
|
||||||
*r_depth = ofs->depth;
|
*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");
|
BLI_assert(!"Error: Texture: Framebuffer is not attached");
|
||||||
return 0;
|
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