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#include <sstream> 24c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 25c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/compiler.hpp" 26c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 27c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "tgsi/tgsi_parse.h" 28c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "tgsi/tgsi_text.h" 29c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "util/u_memory.h" 30c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 31c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezusing namespace clover; 32c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 33c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jereznamespace { 34c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez void 35c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez read_header(const std::string &header, module &m) { 36c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::istringstream ls(header); 37c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::string line; 38c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 39c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez while (getline(ls, line)) { 40c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::istringstream ts(line); 41c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::string name, tok; 42c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez module::size_t offset; 43c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez compat::vector<module::argument> args; 44c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 45c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!(ts >> name)) 46c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez continue; 47c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 48c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!(ts >> offset)) 49c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw build_error("invalid kernel start address"); 50c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 51c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez while (ts >> tok) { 52c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (tok == "scalar") 53c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez args.push_back({ module::argument::scalar, 4 }); 54c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez else if (tok == "global") 55c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez args.push_back({ module::argument::global, 4 }); 56c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez else if (tok == "local") 57c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez args.push_back({ module::argument::local, 4 }); 58c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez else if (tok == "constant") 59c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez args.push_back({ module::argument::constant, 4 }); 60c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez else if (tok == "image2d_rd") 61c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez args.push_back({ module::argument::image2d_rd, 4 }); 62c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez else if (tok == "image2d_wr") 63c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez args.push_back({ module::argument::image2d_wr, 4 }); 64c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez else if (tok == "image3d_rd") 65c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez args.push_back({ module::argument::image3d_rd, 4 }); 66c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez else if (tok == "image3d_wr") 67c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez args.push_back({ module::argument::image3d_wr, 4 }); 68c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez else if (tok == "sampler") 69c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez args.push_back({ module::argument::sampler, 0 }); 70c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez else 71c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw build_error("invalid kernel argument"); 72c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 73c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 74c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez m.syms.push_back({ name, 0, offset, args }); 75c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 76c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 77c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 78c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez void 79c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez read_body(const char *source, module &m) { 80c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez tgsi_token prog[1024]; 81c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 82c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!tgsi_text_translate(source, prog, Elements(prog))) 83c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw build_error("translate failed"); 84c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 85c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez unsigned sz = tgsi_num_tokens(prog) * sizeof(tgsi_token); 86c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez m.secs.push_back({ 0, module::section::text, sz, { (char *)prog, sz } }); 87c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 88c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 89c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 90c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezmodule 91741463e18d8235025de649210e7f88a1b6e7af5aTom Stellardclover::compile_program_tgsi(const compat::string &source) { 92c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const char *body = source.find("COMP\n"); 93c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez module m; 94c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 95c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez read_header({ source.begin(), body }, m); 96c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez read_body(body, m); 97c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 98c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return m; 99c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 100