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