X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fpipelinestate.h;h=bc6087c780ea625d029bc5752c6fc80c3b4bdba0;hb=11a5d4f2a35dfdcf61e16d4fcfba22e20ea6a3db;hp=42543e4dc2596f5de2e2c0a7c71e85f9b64fa4c8;hpb=160e9eea29bd10034733d59507fa1bcca36be401;p=libs%2Fgl.git diff --git a/source/core/pipelinestate.h b/source/core/pipelinestate.h index 42543e4d..bc6087c7 100644 --- a/source/core/pipelinestate.h +++ b/source/core/pipelinestate.h @@ -5,11 +5,13 @@ #include #include "cullface.h" #include "pipelinestate_backend.h" +#include "primitivetype.h" namespace Msp { namespace GL { class Blend; +class Buffer; class DepthTest; class Framebuffer; class Program; @@ -20,6 +22,11 @@ class Texture; class UniformBlock; class VertexSetup; +/** +Stores state for the entire GPU pipeline. + +Applications normally use the higher-level Renderer class rather than this. +*/ class PipelineState: public PipelineStateBackend { friend PipelineStateBackend; @@ -27,58 +34,57 @@ class PipelineState: public PipelineStateBackend private: struct BoundTexture { - unsigned binding; - mutable bool changed; - const Texture *texture; - const Sampler *sampler; + unsigned binding = 0; + mutable bool changed = false; + mutable bool used = false; + const Texture *texture = 0; + const Sampler *sampler = 0; + int level = -1; - BoundTexture(unsigned); + BoundTexture(unsigned b): binding(b) { } }; struct BoundUniformBlock { - int binding; - mutable bool changed; - const UniformBlock *block; + int binding = 0; + mutable bool changed = false; + mutable bool used = false; + const UniformBlock *block = 0; + const Buffer *buffer = 0; - BoundUniformBlock(int); + BoundUniformBlock(int b): binding(b) { } }; enum ChangeMask { - SHPROG = 1, - VERTEX_SETUP = 2, - FACE_CULL = 4, - CLIP_PLANES = 8, - TEXTURES = 16, - UNIFORMS = 32, - DEPTH_TEST = 64, - STENCIL_TEST = 128, - BLEND = 256, - FRAMEBUFFER = 512, - VIEWPORT = 1024, - SCISSOR = 2048 + 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, + PRIMITIVE_TYPE = 2048 }; - const Framebuffer *framebuffer; - const Rect *viewport; - const Rect *scissor; - 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; - const DepthTest *depth_test; - const StencilTest *stencil_test; - const Blend *blend; - mutable unsigned changes; - -public: - PipelineState(); + std::vector textures; + const VertexSetup *vertex_setup = 0; + PrimitiveType primitive_type = TRIANGLES; + FaceWinding front_face = COUNTERCLOCKWISE; + CullMode face_cull = NO_CULL; + const DepthTest *depth_test = 0; + const StencilTest *stencil_test = 0; + const Blend *blend = 0; -private: template void set(T &, T, unsigned); public: @@ -86,17 +92,19 @@ public: 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_texture(unsigned, const Texture *, int, const Sampler *); void set_vertex_setup(const VertexSetup *); + void set_primitive_type(PrimitiveType); 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_uniform_block(int, const UniformBlock *); 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 Rect *get_viewport() const { return viewport; } 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; }