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 "frontend/graw.h"
11 
12 
13 /* Helper functions.  These are the same for all graw implementations.
14  */
15 PUBLIC void *
graw_parse_geometry_shader(struct pipe_context * pipe,const char * text)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 *
graw_parse_vertex_shader(struct pipe_context * pipe,const char * text)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 *
graw_parse_fragment_shader(struct pipe_context * pipe,const char * text)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 bool
graw_parse_args(int * argi,int argc,char * argv[])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 bool
graw_save_surface_to_file(struct pipe_context * pipe,struct pipe_surface * surface,const char * filename)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