]> git.tdb.fi Git - libs/gl.git/blob - source/glsl/modulecache.cpp
Move a few bits of Renderer into a backend class
[libs/gl.git] / source / glsl / modulecache.cpp
1 #include <msp/io/seekable.h>
2 #include "modulecache.h"
3 #include "parser.h"
4 #include "resources.h"
5
6 using namespace std;
7
8 namespace Msp {
9 namespace GL {
10 namespace SL {
11
12 ModuleCache::ModuleCache(DataFile::Collection *r):
13         resources(r),
14         next_source(1)
15 { }
16
17 ModuleCache::ModuleCache(const ModuleCache &other)
18 {
19         for(const auto &kvp: other.modules)
20                 modules[kvp.first] = new Module(*kvp.second);
21 }
22
23 ModuleCache &ModuleCache::operator=(const ModuleCache &other)
24 {
25         for(auto &kvp: modules)
26                 delete kvp.second;
27         modules.clear();
28         for(const auto &kvp: other.modules)
29                 modules[kvp.first] = new Module(*kvp.second);
30         return *this;
31 }
32
33 ModuleCache::~ModuleCache()
34 {
35         for(auto &kvp: modules)
36                 delete kvp.second;
37 }
38
39 const Module &ModuleCache::add_module(const string &source, const string &src_name)
40 {
41         RefPtr<Module> module = new Module;
42         Parser parser(this);
43         unsigned src_index = next_source++;
44         parser.parse(*module, source, src_name, src_index);
45         return *(modules[src_name] = module.release());
46 }
47
48 const Module &ModuleCache::add_module(IO::Base &io, const string &src_name)
49 {
50         RefPtr<Module> module = new Module;
51         Parser parser(this);
52         unsigned src_index = next_source++;
53         parser.parse(*module, io, src_name, src_index);
54         return *(modules[src_name] = module.release());
55 }
56
57 const Module &ModuleCache::get_module(const string &name)
58 {
59         string fn = name+".glsl";
60         auto i = modules.find(fn);
61         if(i!=modules.end())
62                 return *i->second;
63
64         RefPtr<IO::Seekable> io = (resources ? resources->open_raw(fn) : Resources::get_builtins().open(fn));
65         if(!io)
66                 throw runtime_error(format("module %s not found", name));
67
68         return add_module(*io, fn);
69 }
70
71 } // namespace SL
72 } // namespace GL
73 } // namespace Msp