1 2 #include "pipe/p_compiler.h" 3 #include "pipe/p_context.h" 4 #include "pipe/p_shader_tokens.h" 5 #include "pipe/p_state.h" 6 #include "tgsi/tgsi_text.h" 7 #include "util/u_debug.h" 8 #include "util/u_debug_image.h" 9 #include "util/u_memory.h" 10 #include "state_tracker/graw.h" 11 12 13 /* Helper functions. These are the same for all graw implementations. 14 */ 15 PUBLIC void * 16 graw_parse_geometry_shader(struct pipe_context *pipe, 17 const char *text) 18 { 19 struct tgsi_token tokens[1024]; 20 struct pipe_shader_state state; 21 22 if (!tgsi_text_translate(text, tokens, ARRAY_SIZE(tokens))) 23 return NULL; 24 25 memset(&state, 0, sizeof state); 26 state.tokens = tokens; 27 return pipe->create_gs_state(pipe, &state); 28 } 29 30 PUBLIC void * 31 graw_parse_vertex_shader(struct pipe_context *pipe, 32 const char *text) 33 { 34 struct tgsi_token tokens[1024]; 35 struct pipe_shader_state state; 36 37 if (!tgsi_text_translate(text, tokens, ARRAY_SIZE(tokens))) 38 return NULL; 39 40 memset(&state, 0, sizeof state); 41 state.tokens = tokens; 42 return pipe->create_vs_state(pipe, &state); 43 } 44 45 PUBLIC void * 46 graw_parse_fragment_shader(struct pipe_context *pipe, 47 const char *text) 48 { 49 struct tgsi_token tokens[1024]; 50 struct pipe_shader_state state; 51 52 if (!tgsi_text_translate(text, tokens, ARRAY_SIZE(tokens))) 53 return NULL; 54 55 memset(&state, 0, sizeof state); 56 state.tokens = tokens; 57 return pipe->create_fs_state(pipe, &state); 58 } 59 60 static char out_filename[256] = ""; 61 62 PUBLIC boolean 63 graw_parse_args(int *argi, 64 int argc, 65 char *argv[]) 66 { 67 if (strcmp(argv[*argi], "-o") == 0) { 68 if (*argi + 1 >= argc) { 69 return FALSE; 70 } 71 72 strncpy(out_filename, argv[*argi + 1], sizeof(out_filename) - 1); 73 out_filename[sizeof(out_filename) - 1] = '\0'; 74 *argi += 2; 75 return TRUE; 76 } 77 78 return FALSE; 79 } 80 81 PUBLIC boolean 82 graw_save_surface_to_file(struct pipe_context *pipe, 83 struct pipe_surface *surface, 84 const char *filename) 85 { 86 if (!filename || !*filename) { 87 filename = out_filename; 88 if (!filename || !*filename) { 89 return FALSE; 90 } 91 } 92 93 /* XXX: Make that working in release builds. 94 */ 95 debug_dump_surface_bmp(pipe, filename, surface); 96 return TRUE; 97 } 98