X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fpipelinestate.cpp;h=feb429a6eb126cc851f600c6e74144c698bcd5d9;hb=362534d5838123150311360b465026edba38bb7d;hp=23a2ed6a96b9b61dfcabe7e044324da797773572;hpb=38712d8ecc57d043a2419ffbaeeb57f7a6586f14;p=libs%2Fgl.git diff --git a/source/core/pipelinestate.cpp b/source/core/pipelinestate.cpp index 23a2ed6a..feb429a6 100644 --- a/source/core/pipelinestate.cpp +++ b/source/core/pipelinestate.cpp @@ -1,6 +1,8 @@ #include #include +#include "error.h" #include "pipelinestate.h" +#include "uniformblock.h" using namespace std; @@ -37,54 +39,66 @@ void PipelineState::set_shader_program(const Program *p) set(shprog, p, SHPROG); } -void PipelineState::set_vertex_setup(const VertexSetup *s) -{ - set(vertex_setup, s, VERTEX_SETUP); -} - -void PipelineState::set_front_face(FaceWinding w) -{ - set(front_face, w, FACE_CULL); -} - -void PipelineState::set_face_cull(CullMode c) +void PipelineState::set_uniform_block(int binding, const UniformBlock *block) { - set(face_cull, c, FACE_CULL); + auto i = lower_bound_member(uniform_blocks, binding, &BoundUniformBlock::binding); + if(i==uniform_blocks.end() || i->binding!=binding) + i = uniform_blocks.insert(i, BoundUniformBlock(binding)); + const Buffer *buffer = (block ? block->get_buffer() : 0); + if(block!=i->block || buffer!=i->buffer || binding<0) + { + i->block = block; + i->buffer = buffer; + i->changed = true; + i->used = block; + changes |= UNIFORMS; + } } -void PipelineState::set_enabled_clip_planes(unsigned p) +void PipelineState::set_texture(unsigned binding, const Texture *tex, const Sampler *samp) { - set(enabled_clip_planes, p, CLIP_PLANES); + set_texture(binding, tex, -1, samp); } -void PipelineState::set_texture(unsigned binding, const Texture *tex, const Sampler *samp) +void PipelineState::set_texture(unsigned binding, const Texture *tex, int level, const Sampler *samp) { if((tex!=0)!=(samp!=0)) throw invalid_argument("PipelineState::set_texture"); + if(level>=0 && !can_bind_tex_level(level)) + throw invalid_operation("PipelineState::set_texture"); auto i = lower_bound_member(textures, binding, &BoundTexture::binding); if(i==textures.end() || i->binding!=binding) i = textures.insert(i, BoundTexture(binding)); - if(tex!=i->texture || samp!=i->sampler) + if(tex!=i->texture || level!=i->level || samp!=i->sampler) { i->texture = tex; i->sampler = samp; + i->level = level; i->changed = true; + i->used = (tex && samp); changes |= TEXTURES; } } -void PipelineState::set_uniform_block(int binding, const UniformBlock *block) +void PipelineState::set_vertex_setup(const VertexSetup *s) { - auto i = lower_bound_member(uniform_blocks, binding, &BoundUniformBlock::binding); - if(i==uniform_blocks.end() || i->binding!=binding) - i = uniform_blocks.insert(i, BoundUniformBlock(binding)); - if(block!=i->block || binding<0) - { - i->block = block; - i->changed = true; - changes |= UNIFORMS; - } + set(vertex_setup, s, VERTEX_SETUP); +} + +void PipelineState::set_primitive_type(PrimitiveType t) +{ + set(primitive_type, t, PRIMITIVE_TYPE); +} + +void PipelineState::set_front_face(FaceWinding w) +{ + set(front_face, w, FACE_CULL); +} + +void PipelineState::set_face_cull(CullMode c) +{ + set(face_cull, c, FACE_CULL); } void PipelineState::set_depth_test(const DepthTest *dt) @@ -102,20 +116,5 @@ void PipelineState::set_blend(const Blend *b) set(blend, b, BLEND); } - -PipelineState::BoundTexture::BoundTexture(unsigned b): - binding(b), - changed(false), - texture(0), - sampler(0) -{ } - - -PipelineState::BoundUniformBlock::BoundUniformBlock(int b): - binding(b), - changed(false), - block(0) -{ } - } // namespace GL } // namespace Msp