X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fsampler.cpp;h=5ea10c43f6657c13eb3d0fe88824602d09420988;hb=6c1cb01d562bb8fbfe6559f00d42e811caebc8cd;hp=bb37b0747e7d12c732ac4e57234c6b8bc3836344;hpb=dbc91b65728ab9c0e574bb1127cfe4d2da55de7f;p=libs%2Fgl.git diff --git a/source/core/sampler.cpp b/source/core/sampler.cpp index bb37b074..5ea10c43 100644 --- a/source/core/sampler.cpp +++ b/source/core/sampler.cpp @@ -7,8 +7,6 @@ #include #include "error.h" #include "sampler.h" -#include "texture.h" -#include "texunit.h" using namespace std; @@ -28,46 +26,50 @@ Sampler::Sampler(): dirty_params(0) { Require _req(ARB_sampler_objects); + Require _req2(EXT_texture3D); + Require _req3(ARB_shadow); if(ARB_direct_state_access) glCreateSamplers(1, &id); else glGenSamplers(1, &id); } -void Sampler::update_parameter(int mask) const +void Sampler::update() const { - if(mask&MIN_FILTER) - glSamplerParameteri(id, GL_TEXTURE_MIN_FILTER, min_filter); - if(mask&MAG_FILTER) - glSamplerParameteri(id, GL_TEXTURE_MAG_FILTER, mag_filter); - if(mask&MAX_ANISOTROPY) + if(dirty_params&MIN_FILTER) + glSamplerParameteri(id, GL_TEXTURE_MIN_FILTER, get_gl_filter(min_filter)); + if(dirty_params&MAG_FILTER) + glSamplerParameteri(id, GL_TEXTURE_MAG_FILTER, get_gl_filter(mag_filter)); + if(dirty_params&MAX_ANISOTROPY) glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_anisotropy); - if(mask&WRAP_S) - glSamplerParameteri(id, GL_TEXTURE_WRAP_S, wrap_s); - if(mask&WRAP_T) - glSamplerParameteri(id, GL_TEXTURE_WRAP_T, wrap_t); - if(mask&WRAP_R) - glSamplerParameteri(id, GL_TEXTURE_WRAP_R, wrap_r); - if(mask&BORDER_COLOR) + if(dirty_params&WRAP_S) + glSamplerParameteri(id, GL_TEXTURE_WRAP_S, get_gl_wrap(wrap_s)); + if(dirty_params&WRAP_T) + glSamplerParameteri(id, GL_TEXTURE_WRAP_T, get_gl_wrap(wrap_t)); + if(dirty_params&WRAP_R) + glSamplerParameteri(id, GL_TEXTURE_WRAP_R, get_gl_wrap(wrap_r)); + if(dirty_params&BORDER_COLOR) glSamplerParameterfv(id, GL_TEXTURE_BORDER_COLOR, &border_color.r); - if(mask&COMPARE) + if(dirty_params&COMPARE) { glSamplerParameteri(id, GL_TEXTURE_COMPARE_MODE, (compare ? GL_COMPARE_R_TO_TEXTURE : GL_NONE)); if(compare) - glSamplerParameteri(id, GL_TEXTURE_COMPARE_FUNC, cmp_func); + glSamplerParameteri(id, GL_TEXTURE_COMPARE_FUNC, get_gl_predicate(cmp_func)); } + + dirty_params = 0; } void Sampler::set_min_filter(TextureFilter f) { min_filter = f; - update_parameter(MIN_FILTER); + dirty_params |= MIN_FILTER; } void Sampler::set_mag_filter(TextureFilter f) { mag_filter = f; - update_parameter(MAG_FILTER); + dirty_params |= MAG_FILTER; } void Sampler::set_filter(TextureFilter f) @@ -84,84 +86,53 @@ void Sampler::set_max_anisotropy(float a) static Require _req(EXT_texture_filter_anisotropic); max_anisotropy = a; if(EXT_texture_filter_anisotropic) - update_parameter(MAX_ANISOTROPY); + dirty_params |= MAX_ANISOTROPY; } void Sampler::set_wrap(TextureWrap w) { set_wrap_s(w); set_wrap_t(w); - if(EXT_texture3D) - set_wrap_r(w); + set_wrap_r(w); } void Sampler::set_wrap_s(TextureWrap w) { wrap_s = w; - update_parameter(WRAP_S); + dirty_params |= WRAP_S; } void Sampler::set_wrap_t(TextureWrap w) { wrap_t = w; - update_parameter(WRAP_T); + dirty_params |= WRAP_T; } void Sampler::set_wrap_r(TextureWrap w) { - static Require _req(EXT_texture3D); wrap_r = w; - update_parameter(WRAP_R); + dirty_params |= WRAP_R; } void Sampler::set_border_color(const Color &c) { border_color = c; - update_parameter(BORDER_COLOR); + dirty_params |= BORDER_COLOR; } void Sampler::disable_compare() { compare = false; - update_parameter(COMPARE); + dirty_params |= COMPARE; } void Sampler::set_compare(Predicate f) { - static Require _req(ARB_shadow); compare = true; cmp_func = f; dirty_params |= COMPARE; } -void Sampler::bind_to(unsigned i) const -{ - TexUnit &unit = TexUnit::get_unit(i); - - if(unit.set_sampler(this)) - { - 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); - if(unit.set_sampler(0)) - glBindSampler(i, 0); -} - void Sampler::set_debug_name(const string &name) { #ifdef DEBUG @@ -245,6 +216,32 @@ bool is_mipmapped(TextureFilter filter) filter==LINEAR_MIPMAP_NEAREST || filter==LINEAR_MIPMAP_LINEAR); } +unsigned get_gl_filter(TextureFilter filter) +{ + switch(filter) + { + case NEAREST: return GL_NEAREST; + case LINEAR: return GL_LINEAR; + case NEAREST_MIPMAP_NEAREST: return GL_NEAREST_MIPMAP_NEAREST; + case NEAREST_MIPMAP_LINEAR: return GL_NEAREST_MIPMAP_LINEAR; + case LINEAR_MIPMAP_NEAREST: return GL_LINEAR_MIPMAP_NEAREST; + case LINEAR_MIPMAP_LINEAR: return GL_LINEAR_MIPMAP_LINEAR; + default: throw invalid_argument("get_gl_filter"); + } +} + +unsigned get_gl_wrap(TextureWrap wrap) +{ + switch(wrap) + { + case REPEAT: return GL_REPEAT; + case CLAMP_TO_EDGE: return GL_CLAMP_TO_EDGE; + case CLAMP_TO_BORDER: return GL_CLAMP_TO_BORDER; + case MIRRORED_REPEAT: return GL_MIRRORED_REPEAT; + default: throw invalid_argument("get_gl_wrap"); + } +} + void operator>>(const LexicalConverter &c, TextureFilter &tf) { if(c.get()=="NEAREST")