X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fcore%2Fpipelinestate.h;h=31938829ec61186e0cc6863fe7870640e898ebf1;hp=1d313c3b3eb1dea828bacce03d545a4e751748df;hb=7ef75a4c4dbfc437e466381dd67c23357e607b82;hpb=c4d81a13ca8ac1479eca78ee190f3762ef3cbec4 diff --git a/source/core/pipelinestate.h b/source/core/pipelinestate.h index 1d313c3b..31938829 100644 --- a/source/core/pipelinestate.h +++ b/source/core/pipelinestate.h @@ -1,24 +1,34 @@ -#ifndef PIPELINESTATE_H_ -#define PIPELINESTATE_H_ +#ifndef MSP_GL_PIPELINESTATE_H_ +#define MSP_GL_PIPELINESTATE_H_ #include #include #include "cullface.h" +#include "pipelinestate_backend.h" namespace Msp { namespace GL { -class BufferBackedUniformBlock; -class DefaultUniformBlock; +class Blend; +class DepthTest; +class Framebuffer; class Program; +class Rect; class Sampler; +class StencilTest; class Texture; class UniformBlock; class VertexSetup; -class WindingTest; -class PipelineState: public NonCopyable +/** +Stores state for the entire GPU pipeline. + +Applications normally use the higher-level Renderer class rather than this. +*/ +class PipelineState: public PipelineStateBackend { + friend PipelineStateBackend; + private: struct BoundTexture { @@ -41,56 +51,54 @@ private: enum ChangeMask { - SHPROG = 1, - VERTEX_SETUP = 2, - FACE_CULL = 4, - CLIP_PLANES = 8, - TEXTURES = 16, - UNIFORMS = 32 + FRAMEBUFFER = 1, + VIEWPORT = 2, + SCISSOR = 4, + SHPROG = 8, + UNIFORMS = 16, + TEXTURES = 32, + VERTEX_SETUP = 64, + FACE_CULL = 128, + DEPTH_TEST = 256, + STENCIL_TEST = 512, + BLEND = 1024 }; - const Program *shprog; - const VertexSetup *vertex_setup; - FaceWinding front_face; - CullMode face_cull; - unsigned enabled_clip_planes; - std::vector textures; + const Framebuffer *framebuffer = 0; + const Rect *viewport = 0; + const Rect *scissor = 0; + const Program *shprog = 0; std::vector uniform_blocks; - mutable unsigned changes; - - static const PipelineState *last_applied; - static std::vector bound_tex_targets; - -public: - PipelineState(); - ~PipelineState(); + std::vector textures; + const VertexSetup *vertex_setup = 0; + FaceWinding front_face = COUNTERCLOCKWISE; + CullMode face_cull = NO_CULL; + const DepthTest *depth_test = 0; + const StencilTest *stencil_test = 0; + const Blend *blend = 0; + mutable unsigned changes = 0; -private: template void set(T &, T, unsigned); public: + void set_framebuffer(const Framebuffer *); + void set_viewport(const Rect *); + void set_scissor(const Rect *); void set_shader_program(const Program *); + void set_uniform_block(int, const UniformBlock *); + void set_texture(unsigned, const Texture *, const Sampler *); void set_vertex_setup(const VertexSetup *); void set_front_face(FaceWinding); void set_face_cull(CullMode); - void set_enabled_clip_planes(unsigned); - void set_texture(unsigned, const Texture *, const Sampler *); - void set_uniforms(const DefaultUniformBlock *); - void set_uniform_block(unsigned, const BufferBackedUniformBlock *); -private: - void set_uniform_block_(int, const UniformBlock *); -public: + void set_depth_test(const DepthTest *); + void set_stencil_test(const StencilTest *); + void set_blend(const Blend *); + const Framebuffer *get_framebuffer() const { return framebuffer; } const Program *get_shader_program() const { return shprog; } const VertexSetup *get_vertex_setup() const { return vertex_setup; } FaceWinding get_front_face() const { return front_face; } CullMode get_face_cull() const { return face_cull; } - - void apply() const; -private: - void apply(unsigned) const; -public: - static void clear(); }; } // namespace GL