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 */
15PUBLIC void *
16graw_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
30PUBLIC void *
31graw_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
45PUBLIC void *
46graw_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
60static char out_filename[256] = "";
61
62PUBLIC boolean
63graw_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
81PUBLIC boolean
82graw_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