18e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell/**************************************************************************
28e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell *
38e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
48e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * All Rights Reserved.
58e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell *
68e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
78e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * copy of this software and associated documentation files (the
88e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * "Software"), to deal in the Software without restriction, including
98e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish,
108e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to
118e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to
128e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * the following conditions:
138e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell *
148e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * The above copyright notice and this permission notice (including the
158e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * next paragraph) shall be included in all copies or substantial portions
168e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * of the Software.
178e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell *
188e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
198e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
208e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
218e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
228e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
238e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
248e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
258e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell *
268e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell **************************************************************************/
278e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
288e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell /*
298e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell  * Authors:
308e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell  *   Keith Whitwell <keith@tungstengraphics.com>
318e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell  */
328e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
338e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
348e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell#ifndef ST_PROGRAM_H
358e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell#define ST_PROGRAM_H
368e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
37a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul#include "main/mtypes.h"
38ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/program.h"
39f717fd25cc44d7dda5a49dc05337c7ee7c8d2d2fVinson Lee#include "pipe/p_state.h"
40f717fd25cc44d7dda5a49dc05337c7ee7c8d2d2fVinson Lee#include "st_context.h"
41f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain#include "st_glsl_to_tgsi.h"
424824c342c864e870251a7d343c95e51274e50d23Keith Whitwell
43636480cc9c7836daf879cb45644900922cf31f47Brian
443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** Fragment program variant key */
45aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_fp_variant_key
463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct st_context *st;         /**< variants are per-context */
483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /** for glBitmap */
50aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   GLuint bitmap:1;               /**< glBitmap variant? */
513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /** for glDrawPixels */
53aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   GLuint drawpixels:1;           /**< glDrawPixels variant */
543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   GLuint scaleAndBias:1;         /**< glDrawPixels w/ scale and/or bias? */
553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   GLuint pixelMaps:1;            /**< glDrawPixels w/ pixel lookup map? */
563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   GLuint drawpixels_z:1;         /**< glDrawPixels(GL_DEPTH) */
573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   GLuint drawpixels_stencil:1;   /**< glDrawPixels(GL_STENCIL) */
58bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák
59bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák   /** for ARB_color_buffer_float */
60bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák   GLuint clamp_color:1;
613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul};
623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Variant of a fragment program.
663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
67aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_fp_variant
683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /** Parameters which generated this version of fragment program */
70aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant_key key;
713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
72732f69c94e17aae8dae98cdc84fdb232fdda2484Marek Olšák   struct pipe_shader_state tgsi;
73732f69c94e17aae8dae98cdc84fdb232fdda2484Marek Olšák
743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /** Driver's compiled shader */
753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   void *driver_shader;
763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /** For glBitmap variants */
783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct gl_program_parameter_list *parameters;
793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   uint bitmap_sampler;
803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /** next in linked list */
82aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant *next;
833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul};
843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
86636480cc9c7836daf879cb45644900922cf31f47Brian/**
87636480cc9c7836daf879cb45644900922cf31f47Brian * Derived from Mesa gl_fragment_program:
88636480cc9c7836daf879cb45644900922cf31f47Brian */
898e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwellstruct st_fragment_program
908e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell{
918e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell   struct gl_fragment_program Base;
92f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain   struct glsl_to_tgsi_visitor* glsl_to_tgsi;
938e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
94aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant *variants;
958e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell};
968e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
978e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
9807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
99b830b62a47dec70640062c488cbebd2c8ac487f9Brian Paul/** Vertex program variant key */
100aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_vp_variant_key
10107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{
1023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct st_context *st;          /**< variants are per-context */
103a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   boolean passthrough_edgeflags;
104bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák
105bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák   /** for ARB_color_buffer_float */
106bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák   boolean clamp_color;
10707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell};
10807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
10907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
11007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell/**
11107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * This represents a vertex program, especially translated to match
11207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * the inputs of a particular fragment shader.
11307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell */
114aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_vp_variant
11507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{
11607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   /* Parameters which generated this translated version of a vertex
11707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell    * shader:
11807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell    */
119aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_vp_variant_key key;
12007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
121b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   /**
122b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul    * TGSI tokens (to later generate a 'draw' module shader for
123b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul    * selection/feedback/rasterpos)
12407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell    */
125b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   struct pipe_shader_state tgsi;
12607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
12707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   /** Driver's compiled shader */
12807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   void *driver_shader;
12907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
13007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   /** For using our private draw module (glRasterPos) */
13107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   struct draw_vertex_shader *draw_shader;
13207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
13307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   /** Next in linked list */
134aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_vp_variant *next;
13550caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger
136b830b62a47dec70640062c488cbebd2c8ac487f9Brian Paul   /** similar to that in st_vertex_program, but with edgeflags info too */
13750caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   GLuint num_inputs;
13807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell};
13907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
14007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
141636480cc9c7836daf879cb45644900922cf31f47Brian/**
142636480cc9c7836daf879cb45644900922cf31f47Brian * Derived from Mesa gl_fragment_program:
143636480cc9c7836daf879cb45644900922cf31f47Brian */
1444824c342c864e870251a7d343c95e51274e50d23Keith Whitwellstruct st_vertex_program
1454824c342c864e870251a7d343c95e51274e50d23Keith Whitwell{
146bb611c5f1f6aec7ac51d4fa3301422b47f6de795Brian   struct gl_vertex_program Base;  /**< The Mesa vertex program */
147f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain   struct glsl_to_tgsi_visitor* glsl_to_tgsi;
148bb611c5f1f6aec7ac51d4fa3301422b47f6de795Brian
149bb611c5f1f6aec7ac51d4fa3301422b47f6de795Brian   /** maps a Mesa VERT_ATTRIB_x to a packed TGSI input index */
150fa7a5898761fc106c9dbef6f640ce4654eae5136Brian   GLuint input_to_index[VERT_ATTRIB_MAX];
151bb611c5f1f6aec7ac51d4fa3301422b47f6de795Brian   /** maps a TGSI input index back to a Mesa VERT_ATTRIB_x */
152636480cc9c7836daf879cb45644900922cf31f47Brian   GLuint index_to_input[PIPE_MAX_SHADER_INPUTS];
153fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul   GLuint num_inputs;
154fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul
15507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   /** Maps VERT_RESULT_x to slot */
15607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   GLuint result_to_output[VERT_RESULT_MAX];
15707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   ubyte output_semantic_name[VERT_RESULT_MAX];
15807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   ubyte output_semantic_index[VERT_RESULT_MAX];
15907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   GLuint num_outputs;
160ac95fee4fffee77bb7bd798d094ed2e3a7c4019bBrian
161aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /** List of translated variants of this vertex program.
16207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell    */
163aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_vp_variant *variants;
1644824c342c864e870251a7d343c95e51274e50d23Keith Whitwell};
1654824c342c864e870251a7d343c95e51274e50d23Keith Whitwell
1663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
168aa5ba96d294698809186cc4b59034abbd3076812Brian Paul/** Geometry program variant key */
169aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_gp_variant_key
1703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
1713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct st_context *st;          /**< variants are per-context */
1723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /* no other fields yet */
1733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul};
1743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
1773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Geometry program variant.
1783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
179aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_gp_variant
1803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
1813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /* Parameters which generated this translated version of a vertex */
182aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant_key key;
1833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   void *driver_shader;
1853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
186aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant *next;
1873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul};
1883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
190da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin/**
191da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * Derived from Mesa gl_geometry_program:
192da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin */
193da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinstruct st_geometry_program
194da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{
195da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct gl_geometry_program Base;  /**< The Mesa geometry program */
196f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain   struct glsl_to_tgsi_visitor* glsl_to_tgsi;
197da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
198da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /** map GP input back to VP output */
199da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint input_map[PIPE_MAX_SHADER_INPUTS];
200da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
201da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /** maps a Mesa GEOM_ATTRIB_x to a packed TGSI input index */
202da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint input_to_index[GEOM_ATTRIB_MAX];
203da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /** maps a TGSI input index back to a Mesa GEOM_ATTRIB_x */
204da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint index_to_input[PIPE_MAX_SHADER_INPUTS];
205da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
206da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint num_inputs;
207da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
208da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint input_to_slot[GEOM_ATTRIB_MAX];  /**< Maps GEOM_ATTRIB_x to slot */
209da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint num_input_slots;
210da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
211da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
212da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
213da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
214da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct pipe_shader_state tgsi;
2153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
216aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant *variants;
217da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin};
2186da9234fd437f97267e7831f034c78b31156d939Brian
2193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
2203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
2217e4bc84dfc6c05cea3d6fc52173708ddeb33cf45Alan Hourihanestatic INLINE struct st_fragment_program *
2224824c342c864e870251a7d343c95e51274e50d23Keith Whitwellst_fragment_program( struct gl_fragment_program *fp )
2234824c342c864e870251a7d343c95e51274e50d23Keith Whitwell{
2244824c342c864e870251a7d343c95e51274e50d23Keith Whitwell   return (struct st_fragment_program *)fp;
2254824c342c864e870251a7d343c95e51274e50d23Keith Whitwell}
2264824c342c864e870251a7d343c95e51274e50d23Keith Whitwell
22740c543eb71368c646259afb87d5c76551f6b45b7Brian
2287e4bc84dfc6c05cea3d6fc52173708ddeb33cf45Alan Hourihanestatic INLINE struct st_vertex_program *
2294824c342c864e870251a7d343c95e51274e50d23Keith Whitwellst_vertex_program( struct gl_vertex_program *vp )
2304824c342c864e870251a7d343c95e51274e50d23Keith Whitwell{
2314824c342c864e870251a7d343c95e51274e50d23Keith Whitwell   return (struct st_vertex_program *)vp;
2324824c342c864e870251a7d343c95e51274e50d23Keith Whitwell}
2334824c342c864e870251a7d343c95e51274e50d23Keith Whitwell
234da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinstatic INLINE struct st_geometry_program *
2356c669d0c0766c27c58dd3ea7c3bd18b47a922aeaBrian Paulst_geometry_program( struct gl_geometry_program *gp )
236da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{
2376c669d0c0766c27c58dd3ea7c3bd18b47a922aeaBrian Paul   return (struct st_geometry_program *)gp;
238da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin}
23937cf13ed9a429c755f121daa1776b1b30a985ab3Brian
240a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paulstatic INLINE void
241a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paulst_reference_vertprog(struct st_context *st,
242a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul                      struct st_vertex_program **ptr,
243a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul                      struct st_vertex_program *prog)
244a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul{
245a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul   _mesa_reference_program(st->ctx,
246a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul                           (struct gl_program **) ptr,
247a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul                           (struct gl_program *) prog);
248a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul}
249a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul
250a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paulstatic INLINE void
251da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinst_reference_geomprog(struct st_context *st,
252da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                      struct st_geometry_program **ptr,
253da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                      struct st_geometry_program *prog)
254da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{
255da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   _mesa_reference_program(st->ctx,
256da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                           (struct gl_program **) ptr,
257da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                           (struct gl_program *) prog);
258da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin}
259da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
260da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinstatic INLINE void
261a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paulst_reference_fragprog(struct st_context *st,
262a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul                      struct st_fragment_program **ptr,
263a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul                      struct st_fragment_program *prog)
264a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul{
265a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul   _mesa_reference_program(st->ctx,
266a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul                           (struct gl_program **) ptr,
267a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul                           (struct gl_program *) prog);
268a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul}
269a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul
270a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul
271aa5ba96d294698809186cc4b59034abbd3076812Brian Paulextern struct st_vp_variant *
272aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_vp_variant(struct st_context *st,
2733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_vertex_program *stvp,
274aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_vp_variant_key *key);
27537cf13ed9a429c755f121daa1776b1b30a985ab3Brian
27637cf13ed9a429c755f121daa1776b1b30a985ab3Brian
277aa5ba96d294698809186cc4b59034abbd3076812Brian Paulextern struct st_fp_variant *
278aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_fp_variant(struct st_context *st,
2793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_fragment_program *stfp,
280aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_fp_variant_key *key);
28107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
282e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul
283aa5ba96d294698809186cc4b59034abbd3076812Brian Paulextern struct st_gp_variant *
284aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_gp_variant(struct st_context *st,
2853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_geometry_program *stgp,
286aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_gp_variant_key *key);
2873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
2883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
289f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cainextern void
290f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cainst_prepare_vertex_program(struct gl_context *ctx,
291f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                          struct st_vertex_program *stvp);
292f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain
293f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cainextern GLboolean
294f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cainst_prepare_fragment_program(struct gl_context *ctx,
295f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                            struct st_fragment_program *stfp);
296f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain
2973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
2983d203b610045980853d26370ee21fb2ef4aed17eBrian Paulextern void
299aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_vp_variants( struct st_context *st,
30007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                        struct st_vertex_program *stvp );
30137cf13ed9a429c755f121daa1776b1b30a985ab3Brian
302678f80b347801d925c07a774faee1ed3f716de15Brian Paulextern void
303aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_fp_variants( struct st_context *st,
3043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                        struct st_fragment_program *stfp );
3053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
3063d203b610045980853d26370ee21fb2ef4aed17eBrian Paulextern void
307aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_gp_variants(struct st_context *st,
3083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                       struct st_geometry_program *stgp);
3093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
3103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
3113d203b610045980853d26370ee21fb2ef4aed17eBrian Paulextern void
312f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_print_shaders(struct gl_context *ctx);
313678f80b347801d925c07a774faee1ed3f716de15Brian Paul
3143d203b610045980853d26370ee21fb2ef4aed17eBrian Paulextern void
3153d203b610045980853d26370ee21fb2ef4aed17eBrian Paulst_destroy_program_variants(struct st_context *st);
3163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
317678f80b347801d925c07a774faee1ed3f716de15Brian Paul
3186792969cbc0d233942b15285e0fa84e6602733c2Brian Paulextern void
3196792969cbc0d233942b15285e0fa84e6602733c2Brian Paulst_print_current_vertex_program(void);
3206792969cbc0d233942b15285e0fa84e6602733c2Brian Paul
3216792969cbc0d233942b15285e0fa84e6602733c2Brian Paul
3228e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell#endif
323