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)