14c1403f667c6047a44ff494364725b3b7da82c68Brian/**************************************************************************
24c1403f667c6047a44ff494364725b3b7da82c68Brian *
34c1403f667c6047a44ff494364725b3b7da82c68Brian * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
44c1403f667c6047a44ff494364725b3b7da82c68Brian * All Rights Reserved.
54c1403f667c6047a44ff494364725b3b7da82c68Brian *
64c1403f667c6047a44ff494364725b3b7da82c68Brian * Permission is hereby granted, free of charge, to any person obtaining a
74c1403f667c6047a44ff494364725b3b7da82c68Brian * copy of this software and associated documentation files (the
84c1403f667c6047a44ff494364725b3b7da82c68Brian * "Software"), to deal in the Software without restriction, including
94c1403f667c6047a44ff494364725b3b7da82c68Brian * without limitation the rights to use, copy, modify, merge, publish,
104c1403f667c6047a44ff494364725b3b7da82c68Brian * distribute, sub license, and/or sell copies of the Software, and to
114c1403f667c6047a44ff494364725b3b7da82c68Brian * permit persons to whom the Software is furnished to do so, subject to
124c1403f667c6047a44ff494364725b3b7da82c68Brian * the following conditions:
134c1403f667c6047a44ff494364725b3b7da82c68Brian *
144c1403f667c6047a44ff494364725b3b7da82c68Brian * The above copyright notice and this permission notice (including the
154c1403f667c6047a44ff494364725b3b7da82c68Brian * next paragraph) shall be included in all copies or substantial portions
164c1403f667c6047a44ff494364725b3b7da82c68Brian * of the Software.
174c1403f667c6047a44ff494364725b3b7da82c68Brian *
184c1403f667c6047a44ff494364725b3b7da82c68Brian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
194c1403f667c6047a44ff494364725b3b7da82c68Brian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
204c1403f667c6047a44ff494364725b3b7da82c68Brian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
214c1403f667c6047a44ff494364725b3b7da82c68Brian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
224c1403f667c6047a44ff494364725b3b7da82c68Brian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
234c1403f667c6047a44ff494364725b3b7da82c68Brian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
244c1403f667c6047a44ff494364725b3b7da82c68Brian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
254c1403f667c6047a44ff494364725b3b7da82c68Brian *
264c1403f667c6047a44ff494364725b3b7da82c68Brian **************************************************************************/
274c1403f667c6047a44ff494364725b3b7da82c68Brian
284c1403f667c6047a44ff494364725b3b7da82c68Brian#ifndef TGSI_TRANSFORM_H
294c1403f667c6047a44ff494364725b3b7da82c68Brian#define TGSI_TRANSFORM_H
304c1403f667c6047a44ff494364725b3b7da82c68Brian
314c1403f667c6047a44ff494364725b3b7da82c68Brian
324c1403f667c6047a44ff494364725b3b7da82c68Brian#include "pipe/p_shader_tokens.h"
33c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_parse.h"
34c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_build.h"
354c1403f667c6047a44ff494364725b3b7da82c68Brian
364c1403f667c6047a44ff494364725b3b7da82c68Brian
374c1403f667c6047a44ff494364725b3b7da82c68Brian
384c1403f667c6047a44ff494364725b3b7da82c68Brian/**
394c1403f667c6047a44ff494364725b3b7da82c68Brian * Subclass this to add caller-specific data
404c1403f667c6047a44ff494364725b3b7da82c68Brian */
414c1403f667c6047a44ff494364725b3b7da82c68Brianstruct tgsi_transform_context
424c1403f667c6047a44ff494364725b3b7da82c68Brian{
434c1403f667c6047a44ff494364725b3b7da82c68Brian/**** PUBLIC ***/
444c1403f667c6047a44ff494364725b3b7da82c68Brian
454c1403f667c6047a44ff494364725b3b7da82c68Brian   /**
464c1403f667c6047a44ff494364725b3b7da82c68Brian    * User-defined callbacks invoked per instruction.
474c1403f667c6047a44ff494364725b3b7da82c68Brian    */
484c1403f667c6047a44ff494364725b3b7da82c68Brian   void (*transform_instruction)(struct tgsi_transform_context *ctx,
494c1403f667c6047a44ff494364725b3b7da82c68Brian                                 struct tgsi_full_instruction *inst);
504c1403f667c6047a44ff494364725b3b7da82c68Brian
514c1403f667c6047a44ff494364725b3b7da82c68Brian   void (*transform_declaration)(struct tgsi_transform_context *ctx,
524c1403f667c6047a44ff494364725b3b7da82c68Brian                                 struct tgsi_full_declaration *decl);
534c1403f667c6047a44ff494364725b3b7da82c68Brian
544c1403f667c6047a44ff494364725b3b7da82c68Brian   void (*transform_immediate)(struct tgsi_transform_context *ctx,
554c1403f667c6047a44ff494364725b3b7da82c68Brian                               struct tgsi_full_immediate *imm);
563ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   void (*transform_property)(struct tgsi_transform_context *ctx,
573ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin                              struct tgsi_full_property *prop);
584c1403f667c6047a44ff494364725b3b7da82c68Brian
594c1403f667c6047a44ff494364725b3b7da82c68Brian   /**
604c1403f667c6047a44ff494364725b3b7da82c68Brian    * Called at end of input program to allow caller to append extra
614c1403f667c6047a44ff494364725b3b7da82c68Brian    * instructions.  Return number of tokens emitted.
624c1403f667c6047a44ff494364725b3b7da82c68Brian    */
634c1403f667c6047a44ff494364725b3b7da82c68Brian   void (*epilog)(struct tgsi_transform_context *ctx);
644c1403f667c6047a44ff494364725b3b7da82c68Brian
654c1403f667c6047a44ff494364725b3b7da82c68Brian
664c1403f667c6047a44ff494364725b3b7da82c68Brian/*** PRIVATE ***/
674c1403f667c6047a44ff494364725b3b7da82c68Brian
684c1403f667c6047a44ff494364725b3b7da82c68Brian   /**
694c1403f667c6047a44ff494364725b3b7da82c68Brian    * These are setup by tgsi_transform_shader() and cannot be overridden.
704c1403f667c6047a44ff494364725b3b7da82c68Brian    * Meant to be called from in the above user callback functions.
714c1403f667c6047a44ff494364725b3b7da82c68Brian    */
724c1403f667c6047a44ff494364725b3b7da82c68Brian   void (*emit_instruction)(struct tgsi_transform_context *ctx,
734c1403f667c6047a44ff494364725b3b7da82c68Brian                            const struct tgsi_full_instruction *inst);
744c1403f667c6047a44ff494364725b3b7da82c68Brian   void (*emit_declaration)(struct tgsi_transform_context *ctx,
754c1403f667c6047a44ff494364725b3b7da82c68Brian                            const struct tgsi_full_declaration *decl);
764c1403f667c6047a44ff494364725b3b7da82c68Brian   void (*emit_immediate)(struct tgsi_transform_context *ctx,
774c1403f667c6047a44ff494364725b3b7da82c68Brian                          const struct tgsi_full_immediate *imm);
783ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   void (*emit_property)(struct tgsi_transform_context *ctx,
793ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin                         const struct tgsi_full_property *prop);
804c1403f667c6047a44ff494364725b3b7da82c68Brian
814c1403f667c6047a44ff494364725b3b7da82c68Brian   struct tgsi_header *header;
824c1403f667c6047a44ff494364725b3b7da82c68Brian   uint max_tokens_out;
834c1403f667c6047a44ff494364725b3b7da82c68Brian   struct tgsi_token *tokens_out;
844c1403f667c6047a44ff494364725b3b7da82c68Brian   uint ti;
854c1403f667c6047a44ff494364725b3b7da82c68Brian};
864c1403f667c6047a44ff494364725b3b7da82c68Brian
874c1403f667c6047a44ff494364725b3b7da82c68Brian
884c1403f667c6047a44ff494364725b3b7da82c68Brian
894c1403f667c6047a44ff494364725b3b7da82c68Brianextern int
904c1403f667c6047a44ff494364725b3b7da82c68Briantgsi_transform_shader(const struct tgsi_token *tokens_in,
914c1403f667c6047a44ff494364725b3b7da82c68Brian                      struct tgsi_token *tokens_out,
924c1403f667c6047a44ff494364725b3b7da82c68Brian                      uint max_tokens_out,
934c1403f667c6047a44ff494364725b3b7da82c68Brian                      struct tgsi_transform_context *ctx);
944c1403f667c6047a44ff494364725b3b7da82c68Brian
954c1403f667c6047a44ff494364725b3b7da82c68Brian
964c1403f667c6047a44ff494364725b3b7da82c68Brian#endif /* TGSI_TRANSFORM_H */
97