]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/pipelinestate.cpp
Add tessellation shader support to the engine
[libs/gl.git] / source / core / pipelinestate.cpp
index 5ad51502010a1b1c2a2c37e7dd21b2a680dbdf2f..0769d441a83a3de178f932af44142bf2b81c1f73 100644 (file)
@@ -70,11 +70,21 @@ void PipelineState::set_texture(unsigned binding, const Texture *tex, int level,
        if(level>=0 && !can_bind_tex_level(level))
                throw invalid_operation("PipelineState::set_texture");
 
+       set_texture_resource(binding, tex, level, samp);
+}
+
+void PipelineState::set_storage_texture(unsigned binding, const Texture *tex)
+{
+       set_texture_resource(binding, tex, 0, 0);
+}
+
+void PipelineState::set_texture_resource(unsigned binding, const Texture *tex, int level, const Sampler *samp)
+{
        auto i = lower_bound_member(resources, static_cast<int>(binding), &BoundResource::binding);
        if(i==resources.end() || i->binding!=static_cast<int>(binding))
                i = resources.insert(i, BoundResource(binding));
 
-       ResourceType type = (tex ? TEXTURE : NO_RESOURCE);
+       ResourceType type = (tex ? samp ? SAMPLED_TEXTURE : STORAGE_TEXTURE : NO_RESOURCE);
        if(i->type!=type || tex!=i->texture || level!=i->mip_level || samp!=i->sampler)
        {
                i->type = type;
@@ -82,7 +92,7 @@ void PipelineState::set_texture(unsigned binding, const Texture *tex, int level,
                i->sampler = samp;
                i->mip_level = level;
                i->changed = true;
-               i->used = (tex && samp);
+               i->used = tex;
                changes |= RESOURCES;
        }
 }
@@ -97,6 +107,11 @@ void PipelineState::set_primitive_type(PrimitiveType t)
        set(primitive_type, t, PRIMITIVE_TYPE);
 }
 
+void PipelineState::set_patch_size(unsigned s)
+{
+       set(patch_size, s, PATCH_SIZE);
+}
+
 void PipelineState::set_front_face(FaceWinding w)
 {
        set(front_face, w, FACE_CULL);