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