X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fpipelinestate.h;h=e7fdfdc83ff6e17be21b35e0c01b0e8b4c02fcb2;hb=63458ee3bedacf4d498074fcec15600a4932ae7b;hp=8d1d1aaa974c85f89637bf3bd5df8ccfc9511615;hpb=9b3bce7ae76ff8c0c81315d2505ea96bf422a318;p=libs%2Fgl.git diff --git a/source/core/pipelinestate.h b/source/core/pipelinestate.h index 8d1d1aaa..e7fdfdc8 100644 --- a/source/core/pipelinestate.h +++ b/source/core/pipelinestate.h @@ -1,88 +1,117 @@ -#ifndef PIPELINESTATE_H_ -#define PIPELINESTATE_H_ +#ifndef MSP_GL_PIPELINESTATE_H_ +#define MSP_GL_PIPELINESTATE_H_ #include #include +#include "blend.h" +#include "cullface.h" +#include "depthtest.h" +#include "pipelinestate_backend.h" +#include "primitivetype.h" +#include "rect.h" +#include "stenciltest.h" namespace Msp { namespace GL { -class BufferBackedUniformBlock; -class DefaultUniformBlock; +class Buffer; +class Framebuffer; class Program; class Sampler; 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 + enum ResourceType: std::uint8_t { - unsigned binding; - mutable bool changed; - const Texture *texture; - const Sampler *sampler; - - BoundTexture(unsigned); + NO_RESOURCE, + UNIFORM_BLOCK, + TEXTURE }; - struct BoundUniformBlock + struct BoundResource { - int binding; - mutable bool changed; - const UniformBlock *block; - - BoundUniformBlock(int); + int binding = 0; + ResourceType type = NO_RESOURCE; + mutable bool changed = false; + mutable bool used = false; + union + { + const UniformBlock *block; + const Texture *texture; + }; + union + { + const Buffer *buffer; + const Sampler *sampler; + }; + int mip_level = -1; + + BoundResource(int b): binding(b), texture(0), sampler(0) { } }; enum ChangeMask { - SHPROG = 1, - VERTEX_SETUP = 2, - WINDING_TEST = 4, - CLIP_PLANES = 8, - TEXTURES = 16, - UNIFORMS = 32 + FRAMEBUFFER = 1, + VIEWPORT = 2, + SCISSOR = 4, + SHPROG = 8, + RESOURCES = 16, + VERTEX_SETUP = 64, + FACE_CULL = 128, + DEPTH_TEST = 256, + STENCIL_TEST = 512, + BLEND = 1024, + PRIMITIVE_TYPE = 2048 }; - const Program *shprog; - const VertexSetup *vertex_setup; - const WindingTest *winding_test; - unsigned enabled_clip_planes; - std::vector textures; - std::vector uniform_blocks; - mutable unsigned changes; - - static const PipelineState *last_applied; - static std::vector bound_tex_targets; - + const Framebuffer *framebuffer = 0; + Rect viewport = Rect::max(); + Rect scissor = Rect::max(); + const Program *shprog = 0; + std::vector resources; + const VertexSetup *vertex_setup = 0; + PrimitiveType primitive_type = TRIANGLES; + FaceWinding front_face = COUNTERCLOCKWISE; + CullMode face_cull = NO_CULL; + DepthTest depth_test; + StencilTest stencil_test; + Blend blend; + + template + void set(T &, const T &, unsigned); public: - PipelineState(); - ~PipelineState(); - + void set_framebuffer(const Framebuffer *); + void set_viewport(const Rect &); + void set_scissor(const Rect &); void set_shader_program(const Program *); - void set_vertex_setup(const VertexSetup *); - void set_winding_test(const WindingTest *); - void set_enabled_clip_planes(unsigned); + void set_uniform_block(int, const UniformBlock *); 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_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_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; } - const WindingTest *get_winding_test() const { return winding_test; } - - void apply() const; -private: - void apply(unsigned) const; -public: - static void clear(); + FaceWinding get_front_face() const { return front_face; } + CullMode get_face_cull() const { return face_cull; } }; } // namespace GL