1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright © 2011 Intel Corporation 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 (including the next 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software. 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE. 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file test_optpass.cpp 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Standalone test for optimization passes. 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This file provides the "optpass" command for the standalone 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glsl_test app. It accepts either GLSL or high-level IR as input, 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and performs the optimiation passes specified on the command line. 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * It outputs the IR, both before and after optimiations. 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <string> 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <iostream> 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <sstream> 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <getopt.h> 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "ast.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "ir_optimization.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "ir_print_visitor.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "program.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "ir_reader.h" 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "standalone_scaffolding.h" 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgusing namespace std; 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic string read_stdin_to_eof() 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stringbuf sb; 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cin.get(sb, '\0'); 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return sb.str(); 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo_optimization(struct exec_list *ir, const char *optimization) 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int int_0; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int int_1; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int int_2; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int int_3; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int int_4; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sscanf(optimization, "do_common_optimization ( %d , %d ) ", 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &int_0, &int_1) == 2) { 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_common_optimization(ir, int_0 != 0, false, int_1); 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_algebraic") == 0) { 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_algebraic(ir); 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_constant_folding") == 0) { 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_constant_folding(ir); 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_constant_variable") == 0) { 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_constant_variable(ir); 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_constant_variable_unlinked") == 0) { 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_constant_variable_unlinked(ir); 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_copy_propagation") == 0) { 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_copy_propagation(ir); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_copy_propagation_elements") == 0) { 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_copy_propagation_elements(ir); 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_constant_propagation") == 0) { 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_constant_propagation(ir); 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_dead_code") == 0) { 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_dead_code(ir, false); 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_dead_code_local") == 0) { 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_dead_code_local(ir); 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_dead_code_unlinked") == 0) { 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_dead_code_unlinked(ir); 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_dead_functions") == 0) { 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_dead_functions(ir); 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_function_inlining") == 0) { 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_function_inlining(ir); 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (sscanf(optimization, 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "do_lower_jumps ( %d , %d , %d , %d , %d ) ", 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &int_0, &int_1, &int_2, &int_3, &int_4) == 5) { 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_lower_jumps(ir, int_0 != 0, int_1 != 0, int_2 != 0, 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int_3 != 0, int_4 != 0); 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_lower_texture_projection") == 0) { 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_lower_texture_projection(ir); 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_if_simplification") == 0) { 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_if_simplification(ir); 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (sscanf(optimization, "lower_if_to_cond_assign ( %d ) ", 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &int_0) == 1) { 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return lower_if_to_cond_assign(ir, int_0); 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_mat_op_to_vec") == 0) { 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_mat_op_to_vec(ir); 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_noop_swizzle") == 0) { 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_noop_swizzle(ir); 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_structure_splitting") == 0) { 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_structure_splitting(ir); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_swizzle_swizzle") == 0) { 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_swizzle_swizzle(ir); 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_tree_grafting") == 0) { 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_tree_grafting(ir); 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_vec_index_to_cond_assign") == 0) { 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_vec_index_to_cond_assign(ir); 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "do_vec_index_to_swizzle") == 0) { 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do_vec_index_to_swizzle(ir); 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "lower_discard") == 0) { 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return lower_discard(ir); 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (sscanf(optimization, "lower_instructions ( %d ) ", 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &int_0) == 1) { 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return lower_instructions(ir, int_0); 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "lower_noise") == 0) { 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return lower_noise(ir); 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (sscanf(optimization, "lower_variable_index_to_cond_assign " 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "( %d , %d , %d , %d ) ", &int_0, &int_1, &int_2, 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &int_3) == 4) { 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return lower_variable_index_to_cond_assign(ir, int_0 != 0, int_1 != 0, 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int_2 != 0, int_3 != 0); 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (sscanf(optimization, "lower_quadop_vector ( %d ) ", 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &int_0) == 1) { 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return lower_quadop_vector(ir, int_0 != 0); 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (strcmp(optimization, "optimize_redundant_jumps") == 0) { 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return optimize_redundant_jumps(ir); 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("Unrecognized optimization %s\n", optimization); 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exit(EXIT_FAILURE); 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo_optimization_passes(struct exec_list *ir, char **optimizations, 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int num_optimizations, bool quiet) 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean overall_progress = false; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int i = 0; i < num_optimizations; ++i) { 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *optimization = optimizations[i]; 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!quiet) { 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("*** Running optimization %s...", optimization); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean progress = do_optimization(ir, optimization); 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!quiet) { 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("%s\n", progress ? "progress" : "no progress"); 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org validate_ir_tree(ir); 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org overall_progress = overall_progress || progress; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return overall_progress; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint test_optpass(int argc, char **argv) 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int input_format_ir = 0; /* 0=glsl, 1=ir */ 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int loop = 0; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int shader_type = GL_VERTEX_SHADER; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int quiet = 0; 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct option optpass_opts[] = { 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { "input-ir", no_argument, &input_format_ir, 1 }, 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { "input-glsl", no_argument, &input_format_ir, 0 }, 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { "loop", no_argument, &loop, 1 }, 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { "vertex-shader", no_argument, &shader_type, GL_VERTEX_SHADER }, 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { "fragment-shader", no_argument, &shader_type, GL_FRAGMENT_SHADER }, 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { "quiet", no_argument, &quiet, 1 }, 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { NULL, 0, NULL, 0 } 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int idx = 0; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int c; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while ((c = getopt_long(argc, argv, "", optpass_opts, &idx)) != -1) { 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c != 0) { 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("*** usage: %s optpass <optimizations> <options>\n", argv[0]); 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("\n"); 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("Possible options are:\n"); 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf(" --input-ir: input format is IR\n"); 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf(" --input-glsl: input format is GLSL (the default)\n"); 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf(" --loop: run optimizations repeatedly until no progress\n"); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf(" --vertex-shader: test with a vertex shader (the default)\n"); 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf(" --fragment-shader: test with a fragment shader\n"); 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exit(EXIT_FAILURE); 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context local_ctx; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *ctx = &local_ctx; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org initialize_context_to_defaults(ctx, API_OPENGL); 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.NewShader = _mesa_new_shader; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_shader *shader = rzalloc(NULL, struct gl_shader); 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->Type = shader_type; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org string input = read_stdin_to_eof(); 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_glsl_parse_state *state 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = new(shader) _mesa_glsl_parse_state(ctx, shader->Type, shader); 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (input_format_ir) { 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->ir = new(shader) exec_list; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_glsl_initialize_types(state); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_glsl_read_ir(state, shader->ir, input.c_str(), true); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->Source = input.c_str(); 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *source = shader->Source; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state->error = glcpp_preprocess(state, &source, &state->info_log, 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state->extensions, ctx->API) != 0; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!state->error) { 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_glsl_lexer_ctor(state, source); 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_glsl_parse(state); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_glsl_lexer_dtor(state); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->ir = new(shader) exec_list; 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!state->error && !state->translation_unit.is_empty()) 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_ast_to_hir(shader->ir, state); 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Print out the initial IR */ 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!state->error && !quiet) { 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("*** pre-optimization IR:\n"); 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_print_ir(shader->ir, state); 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("\n--\n"); 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Optimization passes */ 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!state->error) { 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean progress; 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org progress = do_optimization_passes(shader->ir, &argv[optind], 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org argc - optind, quiet != 0); 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while (loop && progress); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Print out the resulting IR */ 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!state->error) { 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!quiet) { 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("*** resulting IR:\n"); 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_print_ir(shader->ir, state); 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!quiet) { 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("\n--\n"); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state->error) { 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("*** error(s) occurred:\n"); 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("%s\n", state->info_log); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("--\n"); 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ralloc_free(state); 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ralloc_free(shader); 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return state->error; 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 272