X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fpipelinestate.h;h=e7fdfdc83ff6e17be21b35e0c01b0e8b4c02fcb2;hb=63458ee3bedacf4d498074fcec15600a4932ae7b;hp=d0ff349069cee04e69992d2c94fa76233b9f6f0d;hpb=c89c1fb972fae2cb2f720cb3ec6cf8238ae8d2e1;p=libs%2Fgl.git diff --git a/source/core/pipelinestate.h b/source/core/pipelinestate.h index d0ff3490..e7fdfdc8 100644 --- a/source/core/pipelinestate.h +++ b/source/core/pipelinestate.h @@ -3,20 +3,21 @@ #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 Blend; -class DepthTest; +class Buffer; class Framebuffer; class Program; -class Rect; class Sampler; -class StencilTest; class Texture; class UniformBlock; class VertexSetup; @@ -31,26 +32,32 @@ class PipelineState: public PipelineStateBackend friend PipelineStateBackend; private: - struct BoundTexture + enum ResourceType: std::uint8_t { - unsigned binding = 0; - mutable bool changed = false; - mutable bool used = false; - const Texture *texture = 0; - const Sampler *sampler = 0; - int level = -1; - - BoundTexture(unsigned b): binding(b) { } + NO_RESOURCE, + UNIFORM_BLOCK, + TEXTURE }; - struct BoundUniformBlock + struct BoundResource { int binding = 0; + ResourceType type = NO_RESOURCE; mutable bool changed = false; mutable bool used = false; - const UniformBlock *block = 0; + union + { + const UniformBlock *block; + const Texture *texture; + }; + union + { + const Buffer *buffer; + const Sampler *sampler; + }; + int mip_level = -1; - BoundUniformBlock(int b): binding(b) { } + BoundResource(int b): binding(b), texture(0), sampler(0) { } }; enum ChangeMask @@ -59,8 +66,7 @@ private: VIEWPORT = 2, SCISSOR = 4, SHPROG = 8, - UNIFORMS = 16, - TEXTURES = 32, + RESOURCES = 16, VERTEX_SETUP = 64, FACE_CULL = 128, DEPTH_TEST = 256, @@ -70,25 +76,24 @@ private: }; const Framebuffer *framebuffer = 0; - const Rect *viewport = 0; - const Rect *scissor = 0; + Rect viewport = Rect::max(); + Rect scissor = Rect::max(); const Program *shprog = 0; - std::vector uniform_blocks; - std::vector textures; + std::vector resources; 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; + DepthTest depth_test; + StencilTest stencil_test; + Blend blend; template - void set(T &, T, unsigned); + void set(T &, const T &, unsigned); public: void set_framebuffer(const Framebuffer *); - void set_viewport(const Rect *); - void set_scissor(const Rect *); + 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 *); @@ -97,12 +102,12 @@ public: 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 *); + 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 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; }