/* * Copyright © 2014 Intel Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * * Authors: * Mika Kuoppala * Armin Reese */ #include #include #include #include #include "intel_renderstate.h" #include "intel_batchbuffer.h" static int debug = 0; static void print_usage(char *s) { fprintf(stderr, "%s: \n" " gen: gen to generate for (6,7,8,9)\n", s); } /* Creates the intel_renderstate_genX.c file for the particular * GEN product */ static int print_state(int gen, struct intel_batchbuffer *batch) { int i; unsigned long cmds; fprintf(stderr, "Generating for gen%d\n", gen); printf("#include \"intel_renderstate.h\"\n\n"); /* Relocation offsets. These are byte offsets in the golden context * batch buffer where the BB graphics address will be added to * the indirect state offset already stored in those locations. The * resulting value will inform the GPU where the indirect states are. */ printf("static const u32 gen%d_null_state_relocs[] = {\n", gen); for (i = 0; i < batch->cmds->num_items; i++) { if (intel_batch_is_reloc(batch, i)) printf("\t0x%08x,\n", i * 4); } printf("\t-1,\n};\n\n"); /* GPU commands to execute to set up the RCS golden state. This * state will become the default config. */ printf("static const u32 gen%d_null_state_batch[] = {\n", gen); for (i = 0; i < intel_batch_num_cmds(batch); i++) { const int offset = i * 4; const struct bb_item *cmd = intel_batch_cmd_get(batch, i); printf("\t0x%08x,", cmd->data); if (debug) printf("\t /* 0x%08x %s '%s' */", offset, intel_batch_type_as_str(cmd), cmd->str); if (offset == batch->cmds_end_offset) { cmds = i + 1; printf("\t /* cmds end */"); } if (intel_batch_is_reloc(batch, i)) printf("\t /* reloc */"); if (offset == batch->state_start_offset) printf("\t /* state start */"); if (i == intel_batch_num_cmds(batch) - 1) printf("\t /* state end */"); printf("\n"); } printf("};\n\nRO_RENDERSTATE(%d);\n", gen); fprintf(stderr, "Commands %lu (%lu bytes)\n", cmds, cmds * 4); fprintf(stderr, "State %lu (%lu bytes)\n", batch->state->num_items, batch->state->num_items * 4); fprintf(stderr, "Total %lu (%lu bytes)\n", batch->cmds->num_items, batch->cmds->num_items * 4); fprintf(stderr, "\n"); return 0; } /* Selects generator function for the given product and executes it. */ static int do_generate(int gen) { struct intel_batchbuffer *batch; int ret = -EINVAL; void (*null_state_gen)(struct intel_batchbuffer *batch) = NULL; batch = intel_batchbuffer_create(); if (batch == NULL) return -ENOMEM; switch (gen) { case 6: null_state_gen = gen6_setup_null_render_state; break; case 7: null_state_gen = gen7_setup_null_render_state; break; case 8: null_state_gen = gen8_setup_null_render_state; break; case 9: null_state_gen = gen9_setup_null_render_state; break; } if (null_state_gen == NULL) { printf("no generator found for %d\n", gen); return -EINVAL; } null_state_gen(batch); intel_batch_relocate_state(batch); ret = print_state(gen, batch); return ret; } int main(int argc, char *argv[]) { if (argc < 2) { print_usage(argv[0]); return 1; } if (argc > 2) debug = 1; return do_generate(atoi(argv[1])); }