draw_pipe_pstipple.c revision 7f16246acef4089570abca76a59580691ec6cf68
1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/**************************************************************************
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All Rights Reserved.
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copy of this software and associated documentation files (the
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "Software"), to deal in the Software without restriction, including
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * without limitation the rights to use, copy, modify, merge, publish,
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distribute, sub license, and/or sell copies of the Software, and to
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * permit persons to whom the Software is furnished to do so, subject to
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the following conditions:
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The above copyright notice and this permission notice (including the
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * next paragraph) shall be included in all copies or substantial portions
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * of the Software.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch **************************************************************************/
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Polygon stipple stage:  implement polygon stipple with texture map and
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * fragment program.  The fragment program samples the texture using the
31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch * fragment window coordinate register and does a fragment kill for the
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * stipple-failing fragments.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Authors:  Brian Paul
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "pipe/p_context.h"
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "pipe/p_defines.h"
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "pipe/p_shader_tokens.h"
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "util/u_inlines.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/u_format.h"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "util/u_math.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/u_memory.h"
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "util/u_sampler.h"
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "tgsi/tgsi_transform.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "tgsi/tgsi_dump.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "draw_context.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "draw_pipe.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** Approx number of new tokens for instructions in pstip_transform_inst() */
56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define NUM_NEW_TOKENS 50
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)/**
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Subclass of pipe_shader_state to carry extra fragment shader info.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct pstip_fragment_shader
636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles){
646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)   struct pipe_shader_state state;
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   void *driver_fs;
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch   void *pstip_fs;
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch   uint sampler_unit;
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/**
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Subclass of draw_stage
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct pstip_stage
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct draw_stage stage;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   void *sampler_cso;
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   struct pipe_resource *texture;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   struct pipe_sampler_view *sampler_view;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uint num_samplers;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uint num_sampler_views;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /*
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    * Currently bound state
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   struct pstip_fragment_shader *fs;
8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)   struct {
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      void *samplers[PIPE_MAX_SAMPLERS];
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      struct pipe_sampler_view *sampler_views[PIPE_MAX_SAMPLERS];
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const struct pipe_poly_stipple *stipple;
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   } state;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   /*
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    * Driver interface/override functions
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    */
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   void * (*driver_create_fs_state)(struct pipe_context *,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const struct pipe_shader_state *);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   void (*driver_bind_fs_state)(struct pipe_context *, void *);
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)   void (*driver_delete_fs_state)(struct pipe_context *, void *);
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)   void (*driver_bind_sampler_states)(struct pipe_context *, unsigned, void **);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch   void (*driver_set_sampler_views)(struct pipe_context *,
105c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                    unsigned,
106c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                    struct pipe_sampler_view **);
107c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
108c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch   void (*driver_set_polygon_stipple)(struct pipe_context *,
109c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                      const struct pipe_poly_stipple *);
110c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
111c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch   struct pipe_context *pipe;
112c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch};
113c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
114c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
115c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/**
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Subclass of tgsi_transform_context, used for transforming the
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * user's fragment shader to add the extra texture sample and fragment kill
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * instructions.
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct pstip_transform_context {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct tgsi_transform_context base;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uint tempsUsed;  /**< bitmask */
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int wincoordInput;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int maxInput;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uint samplersUsed;  /**< bitfield of samplers used */
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int freeSampler;  /** an available sampler for the pstipple */
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int texTemp;  /**< temp registers */
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   int numImmed;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   boolean firstInstruction;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TGSI declaration transform callback.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Look for a free sampler, a free input attrib, and two free temp regs.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pstip_transform_decl(struct tgsi_transform_context *ctx,
140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                     struct tgsi_full_declaration *decl)
141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles){
142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)   struct pstip_transform_context *pctx = (struct pstip_transform_context *) ctx;
143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   if (decl->Declaration.File == TGSI_FILE_SAMPLER) {
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      uint i;
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      for (i = decl->Range.First;
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           i <= decl->Range.Last; i++) {
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         pctx->samplersUsed |= 1 << i;
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   }
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   else if (decl->Declaration.File == TGSI_FILE_INPUT) {
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pctx->maxInput = MAX2(pctx->maxInput, (int) decl->Range.Last);
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      if (decl->Semantic.Name == TGSI_SEMANTIC_POSITION)
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         pctx->wincoordInput = (int) decl->Range.First;
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   }
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   else if (decl->Declaration.File == TGSI_FILE_TEMPORARY) {
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      uint i;
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      for (i = decl->Range.First;
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)           i <= decl->Range.Last; i++) {
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         pctx->tempsUsed |= (1 << i);
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      }
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   }
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   ctx->emit_declaration(ctx, decl);
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/**
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * TGSI immediate declaration transform callback.
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * We're just counting the number of immediates here.
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) */
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)pstip_transform_immed(struct tgsi_transform_context *ctx,
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      struct tgsi_full_immediate *immed)
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles){
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   struct pstip_transform_context *pctx = (struct pstip_transform_context *) ctx;
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   ctx->emit_immediate(ctx, immed); /* emit to output shader */
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   pctx->numImmed++;
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/**
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * Find the lowest zero bit in the given word, or -1 if bitfield is all ones.
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) */
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static int
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)free_bit(uint bitfield)
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles){
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   return ffs(~bitfield) - 1;
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/**
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * TGSI instruction transform callback.
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * Replace writes to result.color w/ a temp reg.
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * Upon END instruction, insert texture sampling code for antialiasing.
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) */
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)pstip_transform_inst(struct tgsi_transform_context *ctx,
1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     struct tgsi_full_instruction *inst)
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles){
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   struct pstip_transform_context *pctx = (struct pstip_transform_context *) ctx;
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   if (pctx->firstInstruction) {
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      /* emit our new declarations before the first instruction */
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      struct tgsi_full_declaration decl;
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      struct tgsi_full_instruction newInst;
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      uint i;
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      int wincoordInput;
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      /* find free sampler */
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      pctx->freeSampler = free_bit(pctx->samplersUsed);
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      if (pctx->freeSampler >= PIPE_MAX_SAMPLERS)
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         pctx->freeSampler = PIPE_MAX_SAMPLERS - 1;
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (pctx->wincoordInput < 0)
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         wincoordInput = pctx->maxInput + 1;
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      else
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         wincoordInput = pctx->wincoordInput;
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      /* find one free temp reg */
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      for (i = 0; i < 32; i++) {
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         if ((pctx->tempsUsed & (1 << i)) == 0) {
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            /* found a free temp */
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            if (pctx->texTemp < 0)
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               pctx->texTemp  = i;
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            else
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               break;
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         }
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      assert(pctx->texTemp >= 0);
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      if (pctx->wincoordInput < 0) {
23446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)         /* declare new position input reg */
23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)         decl = tgsi_default_full_declaration();
23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)         decl.Declaration.File = TGSI_FILE_INPUT;
23746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)         decl.Declaration.Interpolate = TGSI_INTERPOLATE_LINEAR; /* XXX? */
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         decl.Declaration.Semantic = 1;
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         decl.Semantic.Name = TGSI_SEMANTIC_POSITION;
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         decl.Semantic.Index = 0;
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         decl.Range.First =
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            decl.Range.Last = wincoordInput;
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         ctx->emit_declaration(ctx, &decl);
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      }
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      /* declare new sampler */
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      decl = tgsi_default_full_declaration();
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      decl.Declaration.File = TGSI_FILE_SAMPLER;
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      decl.Range.First =
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      decl.Range.Last = pctx->freeSampler;
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ctx->emit_declaration(ctx, &decl);
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      /* declare new temp regs */
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      decl = tgsi_default_full_declaration();
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      decl.Declaration.File = TGSI_FILE_TEMPORARY;
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      decl.Range.First =
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      decl.Range.Last = pctx->texTemp;
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ctx->emit_declaration(ctx, &decl);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* emit immediate = {1/32, 1/32, 1, 1}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * The index/position of this immediate will be pctx->numImmed
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         static const float value[4] = { 1.0/32, 1.0/32, 1.0, 1.0 };
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         struct tgsi_full_immediate immed;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         uint size = 4;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         immed = tgsi_default_full_immediate();
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         immed.Immediate.NrTokens = 1 + size; /* one for the token itself */
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         immed.u[0].Float = value[0];
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         immed.u[1].Float = value[1];
271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         immed.u[2].Float = value[2];
272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         immed.u[3].Float = value[3];
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ctx->emit_immediate(ctx, &immed);
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      pctx->firstInstruction = FALSE;
2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /*
28003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)       * Insert new MUL/TEX/KILP instructions at start of program
28103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)       * Take gl_FragCoord, divide by 32 (stipple size), sample the
28203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)       * texture and kill fragment if needed.
28303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)       *
28403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)       * We'd like to use non-normalized texcoords to index into a RECT
28503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)       * texture, but we can only use GL_REPEAT wrap mode with normalized
28603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)       * texcoords.  Darn.
28703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)       */
28803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
28903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      /* MUL texTemp, INPUT[wincoord], 1/32; */
29003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      newInst = tgsi_default_full_instruction();
29103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      newInst.Instruction.Opcode = TGSI_OPCODE_MUL;
29203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      newInst.Instruction.NumDstRegs = 1;
29303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      newInst.Dst[0].Register.File = TGSI_FILE_TEMPORARY;
29403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      newInst.Dst[0].Register.Index = pctx->texTemp;
29503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      newInst.Instruction.NumSrcRegs = 2;
29603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      newInst.Src[0].Register.File = TGSI_FILE_INPUT;
29703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      newInst.Src[0].Register.Index = wincoordInput;
29803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      newInst.Src[1].Register.File = TGSI_FILE_IMMEDIATE;
29903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      newInst.Src[1].Register.Index = pctx->numImmed;
30003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      ctx->emit_instruction(ctx, &newInst);
30103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
30203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      /* TEX texTemp, texTemp, sampler; */
30303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      newInst = tgsi_default_full_instruction();
3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      newInst.Instruction.Opcode = TGSI_OPCODE_TEX;
3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      newInst.Instruction.NumDstRegs = 1;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newInst.Dst[0].Register.File = TGSI_FILE_TEMPORARY;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newInst.Dst[0].Register.Index = pctx->texTemp;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newInst.Instruction.NumSrcRegs = 2;
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      newInst.Instruction.Texture = TRUE;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newInst.Texture.Texture = TGSI_TEXTURE_2D;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newInst.Src[0].Register.File = TGSI_FILE_TEMPORARY;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newInst.Src[0].Register.Index = pctx->texTemp;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newInst.Src[1].Register.File = TGSI_FILE_SAMPLER;
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      newInst.Src[1].Register.Index = pctx->freeSampler;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ctx->emit_instruction(ctx, &newInst);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* KIL -texTemp;   # if -texTemp < 0, KILL fragment */
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newInst = tgsi_default_full_instruction();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newInst.Instruction.Opcode = TGSI_OPCODE_KIL;
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      newInst.Instruction.NumDstRegs = 0;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newInst.Instruction.NumSrcRegs = 1;
3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      newInst.Src[0].Register.File = TGSI_FILE_TEMPORARY;
3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      newInst.Src[0].Register.Index = pctx->texTemp;
324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      newInst.Src[0].Register.Negate = 1;
325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ctx->emit_instruction(ctx, &newInst);
326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   }
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   /* emit this instruction */
3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   ctx->emit_instruction(ctx, inst);
33003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
33103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/**
3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * Generate the frag shader we'll use for doing polygon stipple.
3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * This will be the user's shader prefixed with a TEX and KIL instruction.
3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) */
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static boolean
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)generate_pstip_fs(struct pstip_stage *pstip)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   const struct pipe_shader_state *orig_fs = &pstip->fs->state;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /*struct draw_context *draw = pstip->stage.draw;*/
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pipe_shader_state pstip_fs;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pstip_transform_context transform;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   const uint newLen = tgsi_num_tokens(orig_fs->tokens) + NUM_NEW_TOKENS;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip_fs = *orig_fs; /* copy to init */
34703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)   pstip_fs.tokens = tgsi_alloc_tokens(newLen);
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (pstip_fs.tokens == NULL)
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return FALSE;
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   memset(&transform, 0, sizeof(transform));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   transform.wincoordInput = -1;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   transform.maxInput = -1;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   transform.texTemp = -1;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   transform.firstInstruction = TRUE;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   transform.base.transform_instruction = pstip_transform_inst;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   transform.base.transform_declaration = pstip_transform_decl;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   transform.base.transform_immediate = pstip_transform_immed;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   tgsi_transform_shader(orig_fs->tokens,
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         (struct tgsi_token *) pstip_fs.tokens,
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         newLen, &transform.base);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 /* DEBUG */
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   tgsi_dump(orig_fs->tokens, 0);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   tgsi_dump(pstip_fs.tokens, 0);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   assert(pstip->fs);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip->fs->sampler_unit = transform.freeSampler;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   assert(pstip->fs->sampler_unit < PIPE_MAX_SAMPLERS);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip->fs->pstip_fs = pstip->driver_create_fs_state(pstip->pipe, &pstip_fs);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   FREE((void *)pstip_fs.tokens);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!pstip->fs->pstip_fs)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return FALSE;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return TRUE;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Load texture image with current stipple pattern.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pstip_update_texture(struct pstip_stage *pstip)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   static const uint bit31 = 1 << 31;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pipe_context *pipe = pstip->pipe;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pipe_transfer *transfer;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   const uint *stipple = pstip->state.stipple->stipple;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uint i, j;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ubyte *data;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   transfer = pipe_get_transfer(pipe, pstip->texture, 0, 0,
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                PIPE_TRANSFER_WRITE, 0, 0, 32, 32);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   data = pipe->transfer_map(pipe, transfer);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /*
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Load alpha texture.
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Note: 0 means keep the fragment, 255 means kill it.
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * We'll negate the texel value and use KILP which kills if value
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * is negative.
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (i = 0; i < 32; i++) {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (j = 0; j < 32; j++) {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (stipple[i] & (bit31 >> j)) {
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* fragment "on" */
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            data[i * transfer->stride + j] = 0;
4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         }
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         else {
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* fragment "off" */
416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            data[i * transfer->stride + j] = 255;
4175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         }
418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   }
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)   /* unmap */
4227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   pipe->transfer_unmap(pipe, transfer);
4237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   pipe->transfer_destroy(pipe, transfer);
4247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/**
4287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Create the texture map we'll use for stippling.
4296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) */
4306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)static boolean
4316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)pstip_create_texture(struct pstip_stage *pstip)
432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles){
4336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   struct pipe_context *pipe = pstip->pipe;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pipe_screen *screen = pipe->screen;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pipe_resource texTemp;
4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   struct pipe_sampler_view viewTempl;
4377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   memset(&texTemp, 0, sizeof(texTemp));
4396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   texTemp.target = PIPE_TEXTURE_2D;
4407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   texTemp.format = PIPE_FORMAT_A8_UNORM; /* XXX verify supported by driver! */
4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   texTemp.last_level = 0;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   texTemp.width0 = 32;
4437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   texTemp.height0 = 32;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   texTemp.depth0 = 1;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   texTemp.array_size = 1;
4467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   texTemp.bind = PIPE_BIND_SAMPLER_VIEW;
4477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   pstip->texture = screen->resource_create(screen, &texTemp);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (pstip->texture == NULL)
4507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return FALSE;
4517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
452a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   u_sampler_view_default_template(&viewTempl,
4536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                   pstip->texture,
4546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                   pstip->texture->format);
4556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   pstip->sampler_view = pipe->create_sampler_view(pipe,
4566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                                   pstip->texture,
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   &viewTempl);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!pstip->sampler_view) {
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return FALSE;
460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   }
461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   return TRUE;
463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/**
467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * Create the sampler CSO that'll be used for stippling.
468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */
4696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)static boolean
4706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)pstip_create_sampler(struct pstip_stage *pstip)
4716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles){
4726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   struct pipe_sampler_state sampler;
4736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   struct pipe_context *pipe = pstip->pipe;
4746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   memset(&sampler, 0, sizeof(sampler));
476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   sampler.wrap_s = PIPE_TEX_WRAP_REPEAT;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   sampler.wrap_t = PIPE_TEX_WRAP_REPEAT;
478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   sampler.wrap_r = PIPE_TEX_WRAP_REPEAT;
4795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST;
481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST;
482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   sampler.normalized_coords = 1;
483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   sampler.min_lod = 0.0f;
484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   sampler.max_lod = 0.0f;
485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   pstip->sampler_cso = pipe->create_sampler_state(pipe, &sampler);
487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   if (pstip->sampler_cso == NULL)
488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return FALSE;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return TRUE;
491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * When we're about to draw our first stipple polygon in a batch, this function
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is called to tell the driver to bind our modified fragment shader.
497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */
498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static boolean
499a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bind_pstip_fragment_shader(struct pstip_stage *pstip)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct draw_context *draw = pstip->stage.draw;
502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   if (!pstip->fs->pstip_fs &&
503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       !generate_pstip_fs(pstip))
504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return FALSE;
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   draw->suspend_flushing = TRUE;
507a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   pstip->driver_bind_fs_state(pstip->pipe, pstip->fs->pstip_fs);
508a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   draw->suspend_flushing = FALSE;
509a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   return TRUE;
51090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static INLINE struct pstip_stage *
514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)pstip_stage( struct draw_stage *stage )
515a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles){
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (struct pstip_stage *) stage;
517a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static void
521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)pstip_first_tri(struct draw_stage *stage, struct prim_header *header)
522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
523a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   struct pstip_stage *pstip = pstip_stage(stage);
524a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   struct pipe_context *pipe = pstip->pipe;
525a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   struct draw_context *draw = stage->draw;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uint num_samplers;
527a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   assert(stage->draw->rasterizer->poly_stipple_enable);
529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   /* bind our fragprog */
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (!bind_pstip_fragment_shader(pstip)) {
532a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      stage->tri = draw_pipe_passthrough_tri;
533a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      stage->tri(stage, header);
534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return;
535a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   }
536a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
538a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   /* how many samplers? */
539a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   /* we'll use sampler/texture[pstip->sampler_unit] for the stipple */
540a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   num_samplers = MAX2(pstip->num_sampler_views, pstip->num_samplers);
541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   num_samplers = MAX2(num_samplers, pstip->fs->sampler_unit + 1);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
543a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   /* plug in our sampler, texture */
544a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   pstip->state.samplers[pstip->fs->sampler_unit] = pstip->sampler_cso;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pipe_sampler_view_reference(&pstip->state.sampler_views[pstip->fs->sampler_unit],
546a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                               pstip->sampler_view);
547a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
548a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   assert(num_samplers <= PIPE_MAX_SAMPLERS);
549a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   draw->suspend_flushing = TRUE;
551a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   pstip->driver_bind_sampler_states(pipe, num_samplers, pstip->state.samplers);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip->driver_set_sampler_views(pipe, num_samplers, pstip->state.sampler_views);
553a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   draw->suspend_flushing = FALSE;
554a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   /* now really draw first triangle */
556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   stage->tri = draw_pipe_passthrough_tri;
557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   stage->tri(stage, header);
558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
560a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static void
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pstip_flush(struct draw_stage *stage, unsigned flags)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct draw_context *draw = stage->draw;
565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   struct pstip_stage *pstip = pstip_stage(stage);
566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   struct pipe_context *pipe = pstip->pipe;
567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   stage->tri = pstip_first_tri;
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   stage->next->flush( stage->next, flags );
570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   /* restore original frag shader, texture, sampler state */
572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   draw->suspend_flushing = TRUE;
573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   pstip->driver_bind_fs_state(pipe, pstip->fs ? pstip->fs->driver_fs : NULL);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip->driver_bind_sampler_states(pipe, pstip->num_samplers,
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     pstip->state.samplers);
5765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   pstip->driver_set_sampler_views(pipe,
5775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                   pstip->num_sampler_views,
5785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                   pstip->state.sampler_views);
5795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   draw->suspend_flushing = FALSE;
5805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
5815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void
5845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)pstip_reset_stipple_counter(struct draw_stage *stage)
5855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles){
5865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   stage->next->reset_stipple_counter( stage->next );
5875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
5885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void
5915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)pstip_destroy(struct draw_stage *stage)
5925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles){
5935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   struct pstip_stage *pstip = pstip_stage(stage);
5945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   uint i;
5955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
5975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      pipe_sampler_view_reference(&pstip->state.sampler_views[i], NULL);
5985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   }
5995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   pstip->pipe->delete_sampler_state(pstip->pipe, pstip->sampler_cso);
6015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   pipe_resource_reference(&pstip->texture, NULL);
6035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   if (pstip->sampler_view) {
6055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      pipe_sampler_view_reference(&pstip->sampler_view, NULL);
6065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   }
6075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   draw_free_temp_verts( stage );
6095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   FREE( stage );
6105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
611a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
612a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
613a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/** Create a new polygon stipple drawing stage object */
614a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static struct pstip_stage *
615a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)draw_pstip_stage(struct draw_context *draw, struct pipe_context *pipe)
616a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles){
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pstip_stage *pstip = CALLOC_STRUCT(pstip_stage);
618a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   if (pstip == NULL)
619a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      goto fail;
620a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
621eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   pstip->pipe = pipe;
622a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
623a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   pstip->stage.draw = draw;
6245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   pstip->stage.name = "pstip";
625a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   pstip->stage.next = NULL;
626a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   pstip->stage.point = draw_pipe_passthrough_point;
627a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   pstip->stage.line = draw_pipe_passthrough_line;
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip->stage.tri = pstip_first_tri;
629a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   pstip->stage.flush = pstip_flush;
630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   pstip->stage.reset_stipple_counter = pstip_reset_stipple_counter;
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip->stage.destroy = pstip_destroy;
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!draw_alloc_temp_verts( &pstip->stage, 8 ))
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto fail;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return pstip;
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fail:
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (pstip)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pstip->stage.destroy( &pstip->stage );
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return NULL;
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static struct pstip_stage *
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)pstip_stage_from_pipe(struct pipe_context *pipe)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct draw_context *draw = (struct draw_context *) pipe->draw;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return pstip_stage(draw->pipeline.pstipple);
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
652a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
653a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
654a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/**
655a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * This function overrides the driver's create_fs_state() function and
656a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * will typically be called by the state tracker.
657a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */
658a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static void *
659a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)pstip_create_fs_state(struct pipe_context *pipe,
660a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       const struct pipe_shader_state *fs)
661a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles){
662a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   struct pstip_stage *pstip = pstip_stage_from_pipe(pipe);
663a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   struct pstip_fragment_shader *pstipfs = CALLOC_STRUCT(pstip_fragment_shader);
664a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (pstipfs) {
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pstipfs->state = *fs;
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* pass-through */
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pstipfs->driver_fs = pstip->driver_create_fs_state(pstip->pipe, fs);
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return pstipfs;
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static void
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pstip_bind_fs_state(struct pipe_context *pipe, void *fs)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pstip_stage *pstip = pstip_stage_from_pipe(pipe);
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pstip_fragment_shader *pstipfs = (struct pstip_fragment_shader *) fs;
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* save current */
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip->fs = pstipfs;
683cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   /* pass-through */
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip->driver_bind_fs_state(pstip->pipe,
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               (pstipfs ? pstipfs->driver_fs : NULL));
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pstip_delete_fs_state(struct pipe_context *pipe, void *fs)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pstip_stage *pstip = pstip_stage_from_pipe(pipe);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pstip_fragment_shader *pstipfs = (struct pstip_fragment_shader *) fs;
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* pass-through */
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip->driver_delete_fs_state(pstip->pipe, pstipfs->driver_fs);
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
697a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   if (pstipfs->pstip_fs)
698a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      pstip->driver_delete_fs_state(pstip->pipe, pstipfs->pstip_fs);
699a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
700f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)   FREE(pstipfs);
7015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
702a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
703f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
704a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static void
705424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)pstip_bind_sampler_states(struct pipe_context *pipe,
706f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          unsigned num, void **sampler)
707a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles){
7083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch   struct pstip_stage *pstip = pstip_stage_from_pipe(pipe);
709a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)   uint i;
710a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
711a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)   /* save current */
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   memcpy(pstip->state.samplers, sampler, num * sizeof(void *));
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (i = num; i < PIPE_MAX_SAMPLERS; i++) {
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pstip->state.samplers[i] = NULL;
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip->num_samplers = num;
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* pass-through */
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip->driver_bind_sampler_states(pstip->pipe, num, sampler);
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pstip_set_sampler_views(struct pipe_context *pipe,
725010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        unsigned num,
726010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        struct pipe_sampler_view **views)
727010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
728116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch   struct pstip_stage *pstip = pstip_stage_from_pipe(pipe);
729116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch   uint i;
730010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
731010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   /* save current */
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (i = 0; i < num; i++) {
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pipe_sampler_view_reference(&pstip->state.sampler_views[i], views[i]);
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (; i < PIPE_MAX_SAMPLERS; i++) {
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pipe_sampler_view_reference(&pstip->state.sampler_views[i], NULL);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip->num_sampler_views = num;
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* pass-through */
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip->driver_set_sampler_views(pstip->pipe, num, views);
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pstip_set_polygon_stipple(struct pipe_context *pipe,
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const struct pipe_poly_stipple *stipple)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pstip_stage *pstip = pstip_stage_from_pipe(pipe);
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* save current */
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip->state.stipple = stipple;
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* pass-through */
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip->driver_set_polygon_stipple(pstip->pipe, stipple);
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip_update_texture(pstip);
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Called by drivers that want to install this polygon stipple stage
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * into the draw module's pipeline.  This will not be used if the
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * hardware has native support for polygon stipple.
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)boolean
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)draw_install_pstipple_stage(struct draw_context *draw,
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            struct pipe_context *pipe)
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pstip_stage *pstip;
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pipe->draw = (void *) draw;
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /*
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    * Create / install pgon stipple drawing / prim stage
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip = draw_pstip_stage( draw, pipe );
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (pstip == NULL)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto fail;
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   draw->pipeline.pstipple = &pstip->stage;
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* create special texture, sampler state */
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!pstip_create_texture(pstip))
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto fail;
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!pstip_create_sampler(pstip))
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto fail;
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* save original driver functions */
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip->driver_create_fs_state = pipe->create_fs_state;
793c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch   pstip->driver_bind_fs_state = pipe->bind_fs_state;
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip->driver_delete_fs_state = pipe->delete_fs_state;
7955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
796a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)   pstip->driver_bind_sampler_states = pipe->bind_fragment_sampler_states;
797a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)   pstip->driver_set_sampler_views = pipe->set_fragment_sampler_views;
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pstip->driver_set_polygon_stipple = pipe->set_polygon_stipple;
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* override the driver's functions */
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pipe->create_fs_state = pstip_create_fs_state;
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pipe->bind_fs_state = pstip_bind_fs_state;
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pipe->delete_fs_state = pstip_delete_fs_state;
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   pipe->bind_fragment_sampler_states = pstip_bind_sampler_states;
8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   pipe->set_fragment_sampler_views = pstip_set_sampler_views;
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pipe->set_polygon_stipple = pstip_set_polygon_stipple;
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return TRUE;
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fail:
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (pstip)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pstip->stage.destroy( &pstip->stage );
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return FALSE;
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)