190437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca 290437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca#include "pipe/p_compiler.h" 390437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca#include "pipe/p_context.h" 48bfb9061b775ecf5d5c485b8ad2838f53990a976Vinson Lee#include "pipe/p_shader_tokens.h" 590437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca#include "pipe/p_state.h" 690437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca#include "tgsi/tgsi_text.h" 7136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol#include "util/u_debug.h" 890437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca#include "util/u_memory.h" 990437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca#include "state_tracker/graw.h" 1090437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca 1190437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca 1290437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca/* Helper functions. These are the same for all graw implementations. 1390437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca */ 14601498ae73e654c2de997ea75075613a694d604dJosé FonsecaPUBLIC void * 15601498ae73e654c2de997ea75075613a694d604dJosé Fonsecagraw_parse_geometry_shader(struct pipe_context *pipe, 16601498ae73e654c2de997ea75075613a694d604dJosé Fonseca const char *text) 1790437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca{ 1890437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca struct tgsi_token tokens[1024]; 1990437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca struct pipe_shader_state state; 2090437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca 2190437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca if (!tgsi_text_translate(text, tokens, Elements(tokens))) 2290437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca return NULL; 2390437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca 2490437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca state.tokens = tokens; 2590437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca return pipe->create_gs_state(pipe, &state); 2690437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca} 2790437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca 28601498ae73e654c2de997ea75075613a694d604dJosé FonsecaPUBLIC void * 29601498ae73e654c2de997ea75075613a694d604dJosé Fonsecagraw_parse_vertex_shader(struct pipe_context *pipe, 30601498ae73e654c2de997ea75075613a694d604dJosé Fonseca const char *text) 3190437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca{ 3290437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca struct tgsi_token tokens[1024]; 3390437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca struct pipe_shader_state state; 3490437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca 3590437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca if (!tgsi_text_translate(text, tokens, Elements(tokens))) 3690437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca return NULL; 3790437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca 3890437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca state.tokens = tokens; 3990437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca return pipe->create_vs_state(pipe, &state); 4090437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca} 4190437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca 42601498ae73e654c2de997ea75075613a694d604dJosé FonsecaPUBLIC void * 43601498ae73e654c2de997ea75075613a694d604dJosé Fonsecagraw_parse_fragment_shader(struct pipe_context *pipe, 44601498ae73e654c2de997ea75075613a694d604dJosé Fonseca const char *text) 4590437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca{ 4690437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca struct tgsi_token tokens[1024]; 4790437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca struct pipe_shader_state state; 4890437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca 4990437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca if (!tgsi_text_translate(text, tokens, Elements(tokens))) 5090437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca return NULL; 5190437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca 5290437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca state.tokens = tokens; 5390437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca return pipe->create_fs_state(pipe, &state); 5490437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca} 5590437330e2886fcd351dd11ee0e5aa3e8b523fdcJosé Fonseca 56136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krolstatic char out_filename[256] = ""; 57136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol 58136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal KrolPUBLIC boolean 59136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krolgraw_parse_args(int *argi, 60136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol int argc, 61136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol char *argv[]) 62136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol{ 63136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol if (strcmp(argv[*argi], "-o") == 0) { 64136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol if (*argi + 1 >= argc) { 65136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol return FALSE; 66136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol } 67136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol 68136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol strncpy(out_filename, argv[*argi + 1], sizeof(out_filename) - 1); 69136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol out_filename[sizeof(out_filename) - 1] = '\0'; 70136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol *argi += 2; 71136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol return TRUE; 72136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol } 73136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol 74136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol return FALSE; 75136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol} 76136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol 77136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal KrolPUBLIC boolean 78136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krolgraw_save_surface_to_file(struct pipe_context *pipe, 79136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol struct pipe_surface *surface, 80136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol const char *filename) 81136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol{ 82136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol if (!filename || !*filename) { 83136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol filename = out_filename; 84136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol if (!filename || !*filename) { 85136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol return FALSE; 86136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol } 87136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol } 88136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol 89136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol /* XXX: Make that working in release builds. 90136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol */ 91136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol debug_dump_surface_bmp(pipe, filename, surface); 92136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol return TRUE; 93136ff67ce8a626e628dd76aeb7feba8cf9436cd7Michal Krol} 94