1c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 2c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Copyright 2012 Francisco Jerez 3c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 4c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Permission is hereby granted, free of charge, to any person obtaining a 5c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// copy of this software and associated documentation files (the "Software"), 6c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// to deal in the Software without restriction, including without limitation 7c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// the rights to use, copy, modify, merge, publish, distribute, sublicense, 8c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// and/or sell copies of the Software, and to permit persons to whom the 9c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Software is furnished to do so, subject to the following conditions: 10c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 11c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// The above copyright notice and this permission notice shall be included in 12c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// all copies or substantial portions of the Software. 13c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 14c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// SOFTWARE. 21c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 22c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 23c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#ifndef __CORE_MODULE_HPP__ 24c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#define __CORE_MODULE_HPP__ 25c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 26c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/compat.hpp" 27c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 28c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jereznamespace clover { 29c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez struct module { 30c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez class noent_error { 31c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez public: 32c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez virtual ~noent_error() {} 33c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 34c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 35c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez typedef uint32_t resource_id; 36c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez typedef uint32_t size_t; 37c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 38c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez struct section { 39c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez enum type { 40c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez text, 41c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez data_constant, 42c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez data_global, 43c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez data_local, 44c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez data_private 45c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 46c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 47d724190bce7a10becfb378cad7ef9886ee4d2c8cTom Stellard section(resource_id id, enum type type, size_t size, 48d724190bce7a10becfb378cad7ef9886ee4d2c8cTom Stellard const clover::compat::vector<char> &data) : 49d724190bce7a10becfb378cad7ef9886ee4d2c8cTom Stellard id(id), type(type), size(size), data(data) { } 50d724190bce7a10becfb378cad7ef9886ee4d2c8cTom Stellard section() : id(0), type(text), size(0), data() { } 51d724190bce7a10becfb378cad7ef9886ee4d2c8cTom Stellard 52c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez resource_id id; 53c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez type type; 54c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t size; 55c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez clover::compat::vector<char> data; 56c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 57c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 58c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez struct argument { 59c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez enum type { 60c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez scalar, 61c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez constant, 62c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez global, 63c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez local, 64c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez image2d_rd, 65c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez image2d_wr, 66c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez image3d_rd, 67c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez image3d_wr, 68c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez sampler 69c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 70c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 71d724190bce7a10becfb378cad7ef9886ee4d2c8cTom Stellard argument(enum type type, size_t size) : type(type), size(size) { } 72d724190bce7a10becfb378cad7ef9886ee4d2c8cTom Stellard argument() : type(scalar), size(0) { } 73d724190bce7a10becfb378cad7ef9886ee4d2c8cTom Stellard 74c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez type type; 75c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t size; 76c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 77c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 78c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez struct symbol { 79d724190bce7a10becfb378cad7ef9886ee4d2c8cTom Stellard symbol(const clover::compat::vector<char> &name, resource_id section, 80d724190bce7a10becfb378cad7ef9886ee4d2c8cTom Stellard size_t offset, const clover::compat::vector<argument> &args) : 81d724190bce7a10becfb378cad7ef9886ee4d2c8cTom Stellard name(name), section(section), offset(offset), args(args) { } 82d724190bce7a10becfb378cad7ef9886ee4d2c8cTom Stellard symbol() : name(), section(0), offset(0), args() { } 83d724190bce7a10becfb378cad7ef9886ee4d2c8cTom Stellard 84c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez clover::compat::vector<char> name; 85c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez resource_id section; 86c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t offset; 87c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez clover::compat::vector<argument> args; 88c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 89c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 90c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez void serialize(compat::ostream &os) const; 91c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez static module deserialize(compat::istream &is); 92c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 93c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez /// Look up a symbol by name. Throws module::noent_error if not 94c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez /// found. 95c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const symbol &sym(compat::string name) const; 96c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 97c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez /// Look up a section by type. Throws module::noent_error if not 98c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez /// found. 99c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const section &sec(typename section::type type) const; 100c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 101c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez clover::compat::vector<symbol> syms; 102c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez clover::compat::vector<section> secs; 103c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 104c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 105c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 106c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#endif 107