forked from bartvdbraak/blender
Cleanup: GPUState: Remove stack from the state manager and rename it
This commit is contained in:
parent
d10f000322
commit
482a51aabf
@ -824,10 +824,12 @@
|
||||
#define GL_SOURCE0_ALPHA DO_NOT_USE_GL_SOURCE0_ALPHA
|
||||
#undef GL_SOURCE0_RGB
|
||||
#define GL_SOURCE0_RGB DO_NOT_USE_GL_SOURCE0_RGB
|
||||
#undef GL_SOURCE1_ALPHA
|
||||
#define GL_SOURCE1_ALPHA DO_NOT_USE_GL_SOURCE1_ALPHA
|
||||
#undef GL_SOURCE1_RGB
|
||||
#define GL_SOURCE1_RGB DO_NOT_USE_GL_SOURCE1_RGB
|
||||
#if 0 /* Those are reused as new valid enum! GL_SRC1_COLOR etc... */
|
||||
# undef GL_SOURCE1_ALPHA
|
||||
# define GL_SOURCE1_ALPHA DO_NOT_USE_GL_SOURCE1_ALPHA
|
||||
# undef GL_SOURCE1_RGB
|
||||
# define GL_SOURCE1_RGB DO_NOT_USE_GL_SOURCE1_RGB
|
||||
#endif
|
||||
#undef GL_SOURCE2_ALPHA
|
||||
#define GL_SOURCE2_ALPHA DO_NOT_USE_GL_SOURCE2_ALPHA
|
||||
#undef GL_SOURCE2_RGB
|
||||
|
@ -70,7 +70,7 @@ GPUContext::GPUContext()
|
||||
GPUContext::~GPUContext()
|
||||
{
|
||||
GPU_matrix_state_discard(matrix_state);
|
||||
delete state_stack;
|
||||
delete state_manager;
|
||||
}
|
||||
|
||||
bool GPUContext::is_active_on_thread(void)
|
||||
|
@ -46,7 +46,7 @@ struct GPUContext {
|
||||
GPUShader *shader = NULL;
|
||||
GPUFrameBuffer *current_fbo = NULL;
|
||||
GPUMatrixState *matrix_state = NULL;
|
||||
blender::gpu::GPUStateStack *state_stack = NULL;
|
||||
blender::gpu::GPUStateManager *state_manager = NULL;
|
||||
|
||||
protected:
|
||||
/** Thread on which this context is active. */
|
||||
|
@ -38,15 +38,12 @@
|
||||
|
||||
#include "gpu_state_private.hh"
|
||||
|
||||
/* TODO remove */
|
||||
#include "gl_state.hh"
|
||||
|
||||
using namespace blender::gpu;
|
||||
|
||||
#define SET_STATE(_prefix, _state, _value) \
|
||||
do { \
|
||||
GPUStateStack *stack = GPU_context_active_get()->state_stack; \
|
||||
auto &state_object = stack->_prefix##stack_top_get(); \
|
||||
GPUStateManager *stack = GPU_context_active_get()->state_manager; \
|
||||
auto &state_object = stack->_prefix##state; \
|
||||
state_object._state = _value; \
|
||||
/* TODO remove this and only push state at draw time. */ \
|
||||
stack->set_##_prefix##state(state_object); \
|
||||
@ -107,8 +104,8 @@ void GPU_write_mask(eGPUWriteMask mask)
|
||||
|
||||
void GPU_color_mask(bool r, bool g, bool b, bool a)
|
||||
{
|
||||
GPUStateStack *stack = GPU_context_active_get()->state_stack;
|
||||
auto &state = stack->stack_top_get();
|
||||
GPUStateManager *stack = GPU_context_active_get()->state_manager;
|
||||
auto &state = stack->state;
|
||||
eGPUWriteMask write_mask = state.write_mask;
|
||||
SET_FLAG_FROM_TEST(write_mask, r, GPU_WRITE_RED);
|
||||
SET_FLAG_FROM_TEST(write_mask, g, GPU_WRITE_GREEN);
|
||||
@ -121,8 +118,8 @@ void GPU_color_mask(bool r, bool g, bool b, bool a)
|
||||
|
||||
void GPU_depth_mask(bool depth)
|
||||
{
|
||||
GPUStateStack *stack = GPU_context_active_get()->state_stack;
|
||||
auto &state = stack->stack_top_get();
|
||||
GPUStateManager *stack = GPU_context_active_get()->state_manager;
|
||||
auto &state = stack->state;
|
||||
eGPUWriteMask write_mask = state.write_mask;
|
||||
SET_FLAG_FROM_TEST(write_mask, depth, GPU_WRITE_DEPTH);
|
||||
state.write_mask = write_mask;
|
||||
@ -143,8 +140,8 @@ void GPU_clip_distances(int distances_enabled)
|
||||
|
||||
void GPU_depth_range(float near, float far)
|
||||
{
|
||||
GPUStateStack *stack = GPU_context_active_get()->state_stack;
|
||||
auto &state = stack->mutable_stack_top_get();
|
||||
GPUStateManager *stack = GPU_context_active_get()->state_manager;
|
||||
auto &state = stack->mutable_state;
|
||||
copy_v2_fl2(state.depth_range, near, far);
|
||||
/* TODO remove this and only push state at draw time. */
|
||||
stack->set_mutable_state(state);
|
||||
@ -166,8 +163,8 @@ void GPU_point_size(float size)
|
||||
/* TODO remove and use program point size everywhere */
|
||||
void GPU_program_point_size(bool enable)
|
||||
{
|
||||
GPUStateStack *stack = GPU_context_active_get()->state_stack;
|
||||
auto &state = stack->mutable_stack_top_get();
|
||||
GPUStateManager *stack = GPU_context_active_get()->state_manager;
|
||||
auto &state = stack->mutable_state;
|
||||
/* Set point size sign negative to disable. */
|
||||
state.point_size = fabsf(state.point_size) * (enable ? 1 : -1);
|
||||
/* TODO remove this and only push state at draw time. */
|
||||
@ -176,8 +173,8 @@ void GPU_program_point_size(bool enable)
|
||||
|
||||
void GPU_scissor_test(bool enable)
|
||||
{
|
||||
GPUStateStack *stack = GPU_context_active_get()->state_stack;
|
||||
auto &state = stack->mutable_stack_top_get();
|
||||
GPUStateManager *stack = GPU_context_active_get()->state_manager;
|
||||
auto &state = stack->mutable_state;
|
||||
/* Set point size sign negative to disable. */
|
||||
state.scissor_rect[2] = abs(state.scissor_rect[2]) * (enable ? 1 : -1);
|
||||
/* TODO remove this and only push state at draw time. */
|
||||
@ -186,8 +183,8 @@ void GPU_scissor_test(bool enable)
|
||||
|
||||
void GPU_scissor(int x, int y, int width, int height)
|
||||
{
|
||||
GPUStateStack *stack = GPU_context_active_get()->state_stack;
|
||||
auto &state = stack->mutable_stack_top_get();
|
||||
GPUStateManager *stack = GPU_context_active_get()->state_manager;
|
||||
auto &state = stack->mutable_state;
|
||||
int scissor_rect[4] = {x, y, width, height};
|
||||
copy_v4_v4_int(state.scissor_rect, scissor_rect);
|
||||
/* TODO remove this and only push state at draw time. */
|
||||
@ -196,8 +193,8 @@ void GPU_scissor(int x, int y, int width, int height)
|
||||
|
||||
void GPU_viewport(int x, int y, int width, int height)
|
||||
{
|
||||
GPUStateStack *stack = GPU_context_active_get()->state_stack;
|
||||
auto &state = stack->mutable_stack_top_get();
|
||||
GPUStateManager *stack = GPU_context_active_get()->state_manager;
|
||||
auto &state = stack->mutable_state;
|
||||
int viewport_rect[4] = {x, y, width, height};
|
||||
copy_v4_v4_int(state.viewport_rect, viewport_rect);
|
||||
/* TODO remove this and only push state at draw time. */
|
||||
@ -212,31 +209,31 @@ void GPU_viewport(int x, int y, int width, int height)
|
||||
|
||||
eGPUBlend GPU_blend_get()
|
||||
{
|
||||
GPUState &state = GPU_context_active_get()->state_stack->stack_top_get();
|
||||
GPUState &state = GPU_context_active_get()->state_manager->state;
|
||||
return state.blend;
|
||||
}
|
||||
|
||||
eGPUWriteMask GPU_write_mask_get()
|
||||
{
|
||||
GPUState &state = GPU_context_active_get()->state_stack->stack_top_get();
|
||||
GPUState &state = GPU_context_active_get()->state_manager->state;
|
||||
return state.write_mask;
|
||||
}
|
||||
|
||||
bool GPU_depth_test_enabled()
|
||||
{
|
||||
GPUState &state = GPU_context_active_get()->state_stack->stack_top_get();
|
||||
GPUState &state = GPU_context_active_get()->state_manager->state;
|
||||
return state.depth_test != GPU_DEPTH_NONE;
|
||||
}
|
||||
|
||||
void GPU_scissor_get(int coords[4])
|
||||
{
|
||||
GPUStateMutable &state = GPU_context_active_get()->state_stack->mutable_stack_top_get();
|
||||
GPUStateMutable &state = GPU_context_active_get()->state_manager->mutable_state;
|
||||
copy_v4_v4_int(coords, state.scissor_rect);
|
||||
}
|
||||
|
||||
void GPU_viewport_size_get_f(float coords[4])
|
||||
{
|
||||
GPUStateMutable &state = GPU_context_active_get()->state_stack->mutable_stack_top_get();
|
||||
GPUStateMutable &state = GPU_context_active_get()->state_manager->mutable_state;
|
||||
for (int i = 0; i < 4; i++) {
|
||||
coords[i] = state.viewport_rect[i];
|
||||
}
|
||||
@ -244,13 +241,13 @@ void GPU_viewport_size_get_f(float coords[4])
|
||||
|
||||
void GPU_viewport_size_get_i(int coords[4])
|
||||
{
|
||||
GPUStateMutable &state = GPU_context_active_get()->state_stack->mutable_stack_top_get();
|
||||
GPUStateMutable &state = GPU_context_active_get()->state_manager->mutable_state;
|
||||
copy_v4_v4_int(coords, state.viewport_rect);
|
||||
}
|
||||
|
||||
bool GPU_depth_mask_get(void)
|
||||
{
|
||||
GPUState &state = GPU_context_active_get()->state_stack->stack_top_get();
|
||||
GPUState &state = GPU_context_active_get()->state_manager->state;
|
||||
return (state.write_mask & GPU_WRITE_DEPTH) != 0;
|
||||
}
|
||||
|
||||
@ -262,34 +259,6 @@ bool GPU_mipmap_enabled(void)
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name GPUStateStack
|
||||
* \{ */
|
||||
|
||||
void GPUStateStack::push_stack(void)
|
||||
{
|
||||
stack[stack_top + 1] = stack[stack_top];
|
||||
stack_top++;
|
||||
}
|
||||
|
||||
void GPUStateStack::pop_stack(void)
|
||||
{
|
||||
stack_top--;
|
||||
}
|
||||
|
||||
void GPUStateStack::push_mutable_stack(void)
|
||||
{
|
||||
mutable_stack[mutable_stack_top + 1] = mutable_stack[mutable_stack_top];
|
||||
mutable_stack_top++;
|
||||
}
|
||||
|
||||
void GPUStateStack::pop_mutable_stack(void)
|
||||
{
|
||||
mutable_stack_top--;
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Context Utils
|
||||
* \{ */
|
||||
|
@ -79,6 +79,8 @@ inline GPUState operator^(const GPUState &a, const GPUState &b)
|
||||
/* Mutable state that does not require pipeline change. */
|
||||
union GPUStateMutable {
|
||||
struct {
|
||||
/* Viewport State */
|
||||
/** TODO put inside GPUFramebuffer. */
|
||||
/** Offset + Extent of the drawable region inside the framebuffer. */
|
||||
int viewport_rect[4];
|
||||
/** Offset + Extent of the scissor region inside the framebuffer. */
|
||||
@ -126,41 +128,17 @@ inline GPUStateMutable operator^(const GPUStateMutable &a, const GPUStateMutable
|
||||
return r;
|
||||
}
|
||||
|
||||
#define GPU_STATE_STACK_LEN 4
|
||||
|
||||
class GPUStateStack {
|
||||
private:
|
||||
/** Stack of state for quick temporary modification of the state. */
|
||||
GPUState stack[GPU_STATE_STACK_LEN];
|
||||
GPUStateMutable mutable_stack[GPU_STATE_STACK_LEN];
|
||||
int stack_top = 0;
|
||||
int mutable_stack_top = 0;
|
||||
class GPUStateManager {
|
||||
public:
|
||||
GPUState state;
|
||||
GPUStateMutable mutable_state;
|
||||
|
||||
public:
|
||||
virtual ~GPUStateStack(){};
|
||||
virtual ~GPUStateManager(){};
|
||||
|
||||
virtual void set_state(GPUState &state) = 0;
|
||||
virtual void set_mutable_state(GPUStateMutable &state) = 0;
|
||||
|
||||
void push_stack(void);
|
||||
void pop_stack(void);
|
||||
|
||||
void push_mutable_stack(void);
|
||||
void pop_mutable_stack(void);
|
||||
|
||||
inline GPUState &stack_top_get(void);
|
||||
inline GPUStateMutable &mutable_stack_top_get(void);
|
||||
virtual void set_state(const GPUState &state) = 0;
|
||||
virtual void set_mutable_state(const GPUStateMutable &state) = 0;
|
||||
};
|
||||
|
||||
inline GPUState &GPUStateStack::stack_top_get(void)
|
||||
{
|
||||
return stack[stack_top];
|
||||
}
|
||||
|
||||
inline GPUStateMutable &GPUStateStack::mutable_stack_top_get(void)
|
||||
{
|
||||
return mutable_stack[mutable_stack_top];
|
||||
}
|
||||
|
||||
} // namespace gpu
|
||||
} // namespace blender
|
||||
|
@ -57,7 +57,7 @@ GLContext::GLContext(void *ghost_window, GLSharedOrphanLists &shared_orphan_list
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
|
||||
state_stack = new GLStateStack();
|
||||
state_manager = new GLStateManager();
|
||||
}
|
||||
|
||||
GLContext::~GLContext()
|
||||
|
@ -21,23 +21,20 @@
|
||||
*/
|
||||
|
||||
#include "BLI_math_base.h"
|
||||
#include "BLI_utildefines.h"
|
||||
|
||||
#include "BKE_global.h"
|
||||
|
||||
#include "GPU_extensions.h"
|
||||
#include "GPU_glew.h"
|
||||
#include "GPU_state.h"
|
||||
|
||||
#include "glew-mx.h"
|
||||
|
||||
#include "gl_state.hh"
|
||||
|
||||
using namespace blender::gpu;
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name GLStateStack
|
||||
/** \name GLStateManager
|
||||
* \{ */
|
||||
|
||||
void GLStateStack::set_state(GPUState &state)
|
||||
void GLStateManager::set_state(const GPUState &state)
|
||||
{
|
||||
GPUState changed = state ^ current_;
|
||||
|
||||
@ -52,7 +49,7 @@ void GLStateStack::set_state(GPUState &state)
|
||||
}
|
||||
if (changed.stencil_test != 0 || changed.stencil_op != 0) {
|
||||
set_stencil_test(state.stencil_test, state.stencil_op);
|
||||
set_stencil_mask(state.stencil_test, mutable_stack_top_get());
|
||||
set_stencil_mask(state.stencil_test, mutable_state);
|
||||
}
|
||||
if (changed.clip_distances != 0) {
|
||||
set_clip_distances(state.clip_distances, current_.clip_distances);
|
||||
@ -94,11 +91,14 @@ void GLStateStack::set_state(GPUState &state)
|
||||
current_ = state;
|
||||
}
|
||||
|
||||
void GLStateStack::set_mutable_state(GPUStateMutable &state)
|
||||
void GLStateManager::set_mutable_state(const GPUStateMutable &state)
|
||||
{
|
||||
GPUStateMutable changed = state ^ current_mutable_;
|
||||
|
||||
glViewport(UNPACK4(state.viewport_rect));
|
||||
if ((changed.viewport_rect[0] != 0) || (changed.viewport_rect[1] != 0) ||
|
||||
(changed.viewport_rect[2] != 0) || (changed.viewport_rect[3] != 0)) {
|
||||
glViewport(UNPACK4(state.viewport_rect));
|
||||
}
|
||||
|
||||
if ((changed.scissor_rect[0] != 0) || (changed.scissor_rect[1] != 0) ||
|
||||
(changed.scissor_rect[2] != 0) || (changed.scissor_rect[3] != 0)) {
|
||||
@ -113,12 +113,14 @@ void GLStateStack::set_mutable_state(GPUStateMutable &state)
|
||||
}
|
||||
|
||||
/* TODO remove, should be uniform. */
|
||||
if (state.point_size > 0.0f) {
|
||||
glEnable(GL_PROGRAM_POINT_SIZE);
|
||||
glPointSize(state.point_size);
|
||||
}
|
||||
else {
|
||||
glDisable(GL_PROGRAM_POINT_SIZE);
|
||||
if (changed.point_size != 0) {
|
||||
if (state.point_size > 0.0f) {
|
||||
glEnable(GL_PROGRAM_POINT_SIZE);
|
||||
glPointSize(state.point_size);
|
||||
}
|
||||
else {
|
||||
glDisable(GL_PROGRAM_POINT_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
if (changed.line_width != 0) {
|
||||
@ -145,7 +147,7 @@ void GLStateStack::set_mutable_state(GPUStateMutable &state)
|
||||
/** \name State set functions
|
||||
* \{ */
|
||||
|
||||
void GLStateStack::set_write_mask(const eGPUWriteMask value)
|
||||
void GLStateManager::set_write_mask(const eGPUWriteMask value)
|
||||
{
|
||||
glDepthMask((value & GPU_WRITE_DEPTH) != 0);
|
||||
glColorMask((value & GPU_WRITE_RED) != 0,
|
||||
@ -154,7 +156,7 @@ void GLStateStack::set_write_mask(const eGPUWriteMask value)
|
||||
(value & GPU_WRITE_ALPHA) != 0);
|
||||
}
|
||||
|
||||
void GLStateStack::set_depth_test(const eGPUDepthTest value)
|
||||
void GLStateManager::set_depth_test(const eGPUDepthTest value)
|
||||
{
|
||||
GLenum func;
|
||||
switch (value) {
|
||||
@ -188,7 +190,7 @@ void GLStateStack::set_depth_test(const eGPUDepthTest value)
|
||||
}
|
||||
}
|
||||
|
||||
void GLStateStack::set_stencil_test(const eGPUStencilTest test, const eGPUStencilOp operation)
|
||||
void GLStateManager::set_stencil_test(const eGPUStencilTest test, const eGPUStencilOp operation)
|
||||
{
|
||||
switch (operation) {
|
||||
case GPU_STENCIL_OP_REPLACE:
|
||||
@ -215,7 +217,7 @@ void GLStateStack::set_stencil_test(const eGPUStencilTest test, const eGPUStenci
|
||||
}
|
||||
}
|
||||
|
||||
void GLStateStack::set_stencil_mask(const eGPUStencilTest test, const GPUStateMutable state)
|
||||
void GLStateManager::set_stencil_mask(const eGPUStencilTest test, const GPUStateMutable state)
|
||||
{
|
||||
GLenum func;
|
||||
switch (test) {
|
||||
@ -239,7 +241,7 @@ void GLStateStack::set_stencil_mask(const eGPUStencilTest test, const GPUStateMu
|
||||
glStencilFunc(func, state.stencil_reference, state.stencil_compare_mask);
|
||||
}
|
||||
|
||||
void GLStateStack::set_clip_distances(const int new_dist_len, const int old_dist_len)
|
||||
void GLStateManager::set_clip_distances(const int new_dist_len, const int old_dist_len)
|
||||
{
|
||||
for (int i = 0; i < new_dist_len; i++) {
|
||||
glEnable(GL_CLIP_DISTANCE0 + i);
|
||||
@ -249,7 +251,7 @@ void GLStateStack::set_clip_distances(const int new_dist_len, const int old_dist
|
||||
}
|
||||
}
|
||||
|
||||
void GLStateStack::set_logic_op(const bool enable)
|
||||
void GLStateManager::set_logic_op(const bool enable)
|
||||
{
|
||||
if (enable) {
|
||||
glEnable(GL_COLOR_LOGIC_OP);
|
||||
@ -260,12 +262,12 @@ void GLStateStack::set_logic_op(const bool enable)
|
||||
}
|
||||
}
|
||||
|
||||
void GLStateStack::set_facing(const bool invert)
|
||||
void GLStateManager::set_facing(const bool invert)
|
||||
{
|
||||
glFrontFace((invert) ? GL_CW : GL_CCW);
|
||||
}
|
||||
|
||||
void GLStateStack::set_backface_culling(const eGPUFaceCullTest test)
|
||||
void GLStateManager::set_backface_culling(const eGPUFaceCullTest test)
|
||||
{
|
||||
if (test != GPU_CULL_NONE) {
|
||||
glDisable(GL_CULL_FACE);
|
||||
@ -276,14 +278,14 @@ void GLStateStack::set_backface_culling(const eGPUFaceCullTest test)
|
||||
}
|
||||
}
|
||||
|
||||
void GLStateStack::set_provoking_vert(const eGPUProvokingVertex vert)
|
||||
void GLStateManager::set_provoking_vert(const eGPUProvokingVertex vert)
|
||||
{
|
||||
GLenum value = (vert == GPU_VERTEX_FIRST) ? GL_FIRST_VERTEX_CONVENTION :
|
||||
GL_LAST_VERTEX_CONVENTION;
|
||||
glProvokingVertex(value);
|
||||
}
|
||||
|
||||
void GLStateStack::set_shadow_bias(const bool enable)
|
||||
void GLStateManager::set_shadow_bias(const bool enable)
|
||||
{
|
||||
if (enable) {
|
||||
glEnable(GL_POLYGON_OFFSET_FILL);
|
||||
@ -297,7 +299,7 @@ void GLStateStack::set_shadow_bias(const bool enable)
|
||||
}
|
||||
}
|
||||
|
||||
void GLStateStack::set_blend(const eGPUBlend value)
|
||||
void GLStateManager::set_blend(const eGPUBlend value)
|
||||
{
|
||||
/**
|
||||
* Factors to the equation.
|
||||
|
@ -31,18 +31,17 @@
|
||||
namespace blender {
|
||||
namespace gpu {
|
||||
|
||||
class GLStateStack : public GPUStateStack {
|
||||
class GLStateManager : public GPUStateManager {
|
||||
private:
|
||||
/** Current state of the GL implementation. Avoids resetting the whole state for every change. */
|
||||
GPUState current_;
|
||||
GPUStateMutable current_mutable_;
|
||||
|
||||
public:
|
||||
void set_state(GPUState &state) override;
|
||||
void set_mutable_state(GPUStateMutable &state) override;
|
||||
void set_state(const GPUState &state) override;
|
||||
void set_mutable_state(const GPUStateMutable &state) override;
|
||||
|
||||
public:
|
||||
/* TODO to become private */
|
||||
private:
|
||||
static void set_write_mask(const eGPUWriteMask value);
|
||||
static void set_depth_test(const eGPUDepthTest value);
|
||||
static void set_stencil_test(const eGPUStencilTest test, const eGPUStencilOp operation);
|
||||
@ -55,7 +54,7 @@ class GLStateStack : public GPUStateStack {
|
||||
static void set_shadow_bias(const bool enable);
|
||||
static void set_blend(const eGPUBlend value);
|
||||
|
||||
MEM_CXX_CLASS_ALLOC_FUNCS("GLStateStack")
|
||||
MEM_CXX_CLASS_ALLOC_FUNCS("GLStateManager")
|
||||
};
|
||||
|
||||
} // namespace gpu
|
||||
|
Loading…
Reference in New Issue
Block a user