2 #include <msp/core/algorithm.h>
4 #include "pipelinestate.h"
5 #include "uniformblock.h"
13 void PipelineState::set(T &target, T value, unsigned flag)
22 void PipelineState::set_framebuffer(const Framebuffer *f)
24 set(framebuffer, f, FRAMEBUFFER);
27 void PipelineState::set_viewport(const Rect *v)
29 set(viewport, v, VIEWPORT);
32 void PipelineState::set_scissor(const Rect *s)
34 set(scissor, s, SCISSOR);
37 void PipelineState::set_shader_program(const Program *p)
39 set(shprog, p, SHPROG);
42 void PipelineState::set_uniform_block(int binding, const UniformBlock *block)
44 auto i = lower_bound_member(uniform_blocks, binding, &BoundUniformBlock::binding);
45 if(i==uniform_blocks.end() || i->binding!=binding)
46 i = uniform_blocks.insert(i, BoundUniformBlock(binding));
48 const Buffer *buffer = (block ? block->get_buffer() : 0);
49 if(block!=i->block || buffer!=i->buffer || binding<0)
58 void PipelineState::set_texture(unsigned binding, const Texture *tex, const Sampler *samp)
60 set_texture(binding, tex, -1, samp);
63 void PipelineState::set_texture(unsigned binding, const Texture *tex, int level, const Sampler *samp)
65 if((tex!=0)!=(samp!=0))
66 throw invalid_argument("PipelineState::set_texture");
67 if(level>=0 && !can_bind_tex_level(level))
68 throw invalid_operation("PipelineState::set_texture");
70 auto i = lower_bound_member(textures, binding, &BoundTexture::binding);
71 if(i==textures.end() || i->binding!=binding)
72 i = textures.insert(i, BoundTexture(binding));
73 i->used = (tex && samp);
74 if(tex!=i->texture || level!=i->level || samp!=i->sampler)
84 void PipelineState::set_vertex_setup(const VertexSetup *s)
86 set(vertex_setup, s, VERTEX_SETUP);
89 void PipelineState::set_primitive_type(PrimitiveType t)
91 set(primitive_type, t, PRIMITIVE_TYPE);
94 void PipelineState::set_front_face(FaceWinding w)
96 set(front_face, w, FACE_CULL);
99 void PipelineState::set_face_cull(CullMode c)
101 set(face_cull, c, FACE_CULL);
104 void PipelineState::set_depth_test(const DepthTest *dt)
106 set(depth_test, dt, DEPTH_TEST);
109 void PipelineState::set_stencil_test(const StencilTest *st)
111 set(stencil_test, st, STENCIL_TEST);
114 void PipelineState::set_blend(const Blend *b)
116 set(blend, b, BLEND);