X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fsampler.cpp;h=cc54901b683a5f635f73eb69252eb8a9b82fa59e;hp=9476ffe9fdca6ac930b37beeb4bf85cf42af713a;hb=6cbcaf877f0be27b4d921d1c182f5e21d4662268;hpb=635e5dc39adf09051bdacadbc402ddf22f7807a3 diff --git a/source/sampler.cpp b/source/sampler.cpp index 9476ffe9..cc54901b 100644 --- a/source/sampler.cpp +++ b/source/sampler.cpp @@ -14,6 +14,18 @@ using namespace std; namespace Msp { namespace GL { +Sampler::Sampler(): + owner(0) +{ + init(); + + Require _req(ARB_sampler_objects); + if(ARB_direct_state_access) + glCreateSamplers(1, &id); + else + glGenSamplers(1, &id); +} + Sampler::Sampler(const Texture &tex): id(0), owner(&tex) @@ -39,16 +51,25 @@ void Sampler::init() void Sampler::update_parameter(int mask) const { - if(!owner->get_id() || (!ARB_direct_state_access && TexUnit::current().get_texture()!=owner)) + if(owner) { - TexUnit *unit = TexUnit::find_unit(owner); - if(!unit) + if(!owner->get_id()) { dirty_params |= mask; return; } - unit->bind(); + if(!ARB_direct_state_access && TexUnit::current().get_texture()!=owner) + { + TexUnit *unit = TexUnit::find_unit(owner); + if(!unit) + { + dirty_params |= mask; + return; + } + + unit->bind(); + } } if(mask&MIN_FILTER) @@ -73,7 +94,9 @@ void Sampler::update_parameter(int mask) const void Sampler::set_parameter_i(unsigned param, int value) const { - if(ARB_direct_state_access) + if(id) + glSamplerParameteri(id, param, value); + else if(ARB_direct_state_access) glTextureParameteri(owner->get_id(), param, value); else glTexParameteri(owner->get_target(), param, value); @@ -81,7 +104,9 @@ void Sampler::set_parameter_i(unsigned param, int value) const void Sampler::set_parameter_f(unsigned param, float value) const { - if(ARB_direct_state_access) + if(id) + glSamplerParameterf(id, param, value); + else if(ARB_direct_state_access) glTextureParameterf(owner->get_id(), param, value); else glTexParameterf(owner->get_target(), param, value); @@ -160,16 +185,36 @@ void Sampler::set_compare(Predicate f) void Sampler::bind_to(unsigned i) const { TexUnit &unit = TexUnit::get_unit(i); - if(owner!=unit.get_texture()) + if(owner && owner!=unit.get_texture()) throw invalid_operation("Sampler::bind_to"); - if(dirty_params) + const Sampler *cur = unit.get_sampler(); + if(unit.set_sampler(this)) { - update_parameter(dirty_params); - dirty_params = 0; + if(!owner || (cur && cur->id)) + glBindSampler(i, id); + + if(dirty_params) + { + update_parameter(dirty_params); + dirty_params = 0; + } } } +const Sampler *Sampler::current(unsigned i) +{ + return TexUnit::get_unit(i).get_sampler(); +} + +void Sampler::unbind_from(unsigned i) +{ + TexUnit &unit = TexUnit::get_unit(i); + const Sampler *cur = unit.get_sampler(); + if(unit.set_sampler(0) && cur->id) + glBindSampler(i, 0); +} + void Sampler::unload() { // TODO check which params actually need refreshing