]> git.tdb.fi Git - libs/gl.git/blob - source/core/texunit.cpp
Store implementation limits in a central struct
[libs/gl.git] / source / core / texunit.cpp
1 #include <stdexcept>
2 #include <msp/gl/extensions/arb_multitexture.h>
3 #include <msp/gl/extensions/arb_vertex_shader.h>
4 #include "deviceinfo.h"
5 #include "gl.h"
6 #include "misc.h"
7 #include "texture.h"
8 #include "texunit.h"
9
10 using namespace std;
11
12 namespace Msp {
13 namespace GL {
14
15 vector<TexUnit> TexUnit::units;
16 TexUnit *TexUnit::cur_unit = 0;
17
18 TexUnit::TexUnit():
19         texture(0),
20         sampler(0)
21 { }
22
23 bool TexUnit::set_texture(const Texture *tex)
24 {
25         bool result = (tex!=texture);
26         texture = tex;
27         return result;
28 }
29
30 bool TexUnit::set_sampler(const Sampler *samp)
31 {
32         bool result = (samp!=sampler);
33         sampler = samp;
34         return result;
35 }
36
37 void TexUnit::bind()
38 {
39         if(cur_unit!=this && (cur_unit || index))
40                 glActiveTexture(GL_TEXTURE0+index);
41         cur_unit = this;
42 }
43
44 unsigned TexUnit::get_n_units()
45 {
46         return Limits::get_global().max_texture_bindings;
47 }
48
49 TexUnit &TexUnit::get_unit(unsigned n)
50 {
51         if(n>0)
52                 static Require _req(ARB_multitexture);
53         if(n>=Limits::get_global().max_texture_bindings)
54                 throw out_of_range("TexUnit::get_unit");
55
56         if(units.size()<=n)
57         {
58                 unsigned i = units.size();
59                 units.resize(n+1, TexUnit());
60                 for(; i<units.size(); ++i)
61                         units[i].index = i;
62         }
63
64         return units[n];
65 }
66
67 TexUnit &TexUnit::current()
68 {
69         if(!cur_unit)
70                 get_unit(0).bind();
71         return *cur_unit;
72 }
73
74 TexUnit *TexUnit::find_unit(const Texture *tex)
75 {
76         for(vector<TexUnit>::iterator i=units.begin(); i!=units.end(); ++i)
77                 if(i->texture==tex)
78                         return &*i;
79         return 0;
80 }
81
82 } // namespace GL
83 } // namespace Msp