1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Authors: Keith Whitwell <keith@tungstengraphics.com> 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Notes on wide points and sprite mode: 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In wide point/sprite mode we effectively need to convert each incoming 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * vertex into four outgoing vertices specifying the corners of a quad. 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Since we don't (yet) have geometry shaders, we have to handle this here 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in the draw module. 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For sprites, it also means that this is where we have to handle texcoords 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for the vertices of the quad. OpenGL's GL_COORD_REPLACE state specifies 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * if/how enabled texcoords are automatically generated for sprites. We pass 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * that info through gallium in the pipe_rasterizer_state::sprite_coord_mode 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * array. 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Additionally, GLSL's gl_PointCoord fragment attribute has to be handled 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * here as well. This is basically an additional texture/generic attribute 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * that varies .x from 0 to 1 horizontally across the point and varies .y 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * vertically from 0 to 1 down the sprite. 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * With geometry shaders, the state tracker could create a GS to do 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * most/all of this. 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h" 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h" 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_shader_tokens.h" 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw_fs.h" 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw_vs.h" 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw_pipe.h" 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct widepoint_stage { 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_stage stage; /**< base class */ 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float half_point_size; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float xbias; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float ybias; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** for automatic texcoord generation/replacement */ 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint num_texcoord_gen; 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint texcoord_gen_slot[PIPE_MAX_SHADER_OUTPUTS]; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int psize_slot; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct widepoint_stage * 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwidepoint_stage( struct draw_stage *stage ) 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (struct widepoint_stage *)stage; 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the vertex texcoords for sprite mode. 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Coords may be left untouched or set to a right-side-up or upside-down 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * orientation. 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void set_texcoords(const struct widepoint_stage *wide, 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex_header *v, const float tc[4]) 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct draw_context *draw = wide->stage.draw; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_rasterizer_state *rast = draw->rasterizer; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint texcoord_mode = rast->sprite_coord_mode; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i; 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < wide->num_texcoord_gen; i++) { 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint slot = wide->texcoord_gen_slot[i]; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->data[slot][0] = tc[0]; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texcoord_mode == PIPE_SPRITE_COORD_LOWER_LEFT) 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->data[slot][1] = 1.0f - tc[1]; 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->data[slot][1] = tc[1]; 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->data[slot][2] = tc[2]; 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->data[slot][3] = tc[3]; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* If there are lots of sprite points (and why wouldn't there be?) it 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * would probably be more sensible to change hardware setup to 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * optimize this rather than doing the whole thing in software like 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * this. 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void widepoint_point( struct draw_stage *stage, 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct prim_header *header ) 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct widepoint_stage *wide = widepoint_stage(stage); 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned pos = draw_current_shader_position_output(stage->draw); 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const boolean sprite = (boolean) stage->draw->rasterizer->point_quad_rasterization; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float half_size; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float left_adj, right_adj, bot_adj, top_adj; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct prim_header tri; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* four dups of original vertex */ 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex_header *v0 = dup_vert(stage, header->v[0], 0); 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex_header *v1 = dup_vert(stage, header->v[0], 1); 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex_header *v2 = dup_vert(stage, header->v[0], 2); 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex_header *v3 = dup_vert(stage, header->v[0], 3); 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float *pos0 = v0->data[pos]; 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float *pos1 = v1->data[pos]; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float *pos2 = v2->data[pos]; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float *pos3 = v3->data[pos]; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* point size is either per-vertex or fixed size */ 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (wide->psize_slot >= 0) { 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org half_size = header->v[0]->data[wide->psize_slot][0]; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org half_size *= 0.5f; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org half_size = wide->half_point_size; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org left_adj = -half_size + wide->xbias; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org right_adj = half_size + wide->xbias; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bot_adj = half_size + wide->ybias; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org top_adj = -half_size + wide->ybias; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos0[0] += left_adj; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos0[1] += top_adj; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos1[0] += left_adj; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos1[1] += bot_adj; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos2[0] += right_adj; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos2[1] += top_adj; 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos3[0] += right_adj; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos3[1] += bot_adj; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sprite) { 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const float tex00[4] = { 0, 0, 0, 1 }; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const float tex01[4] = { 0, 1, 0, 1 }; 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const float tex11[4] = { 1, 1, 0, 1 }; 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const float tex10[4] = { 1, 0, 0, 1 }; 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_texcoords( wide, v0, tex00 ); 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_texcoords( wide, v1, tex01 ); 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_texcoords( wide, v2, tex10 ); 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_texcoords( wide, v3, tex11 ); 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tri.det = header->det; /* only the sign matters */ 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tri.v[0] = v0; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tri.v[1] = v2; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tri.v[2] = v3; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stage->next->tri( stage->next, &tri ); 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tri.v[0] = v0; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tri.v[1] = v3; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tri.v[2] = v1; 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stage->next->tri( stage->next, &tri ); 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwidepoint_first_point(struct draw_stage *stage, 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct prim_header *header) 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct widepoint_stage *wide = widepoint_stage(stage); 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_context *draw = stage->draw; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = draw->pipe; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_rasterizer_state *rast = draw->rasterizer; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *r; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wide->half_point_size = 0.5f * rast->point_size; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wide->xbias = 0.0; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wide->ybias = 0.0; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rast->gl_rasterization_rules) { 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wide->xbias = 0.125; 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wide->ybias = -0.125; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Disable triangle culling, stippling, unfilled mode etc. */ 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = draw_get_rasterizer_no_cull(draw, rast->scissor, rast->flatshade); 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->suspend_flushing = TRUE; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_rasterizer_state(pipe, r); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->suspend_flushing = FALSE; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX we won't know the real size if it's computed by the vertex shader! */ 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((rast->point_size > draw->pipeline.wide_point_threshold) || 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (rast->point_quad_rasterization && draw->pipeline.point_sprite)) { 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stage->point = widepoint_point; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stage->point = draw_pipe_passthrough_point; 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_remove_extra_vertex_attribs(draw); 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rast->point_quad_rasterization) { 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct draw_fragment_shader *fs = draw->fs.fragment_shader; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(fs); 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wide->num_texcoord_gen = 0; 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Loop over fragment shader inputs looking for generic inputs 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for which bit 'k' in sprite_coord_enable is set. 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < fs->info.num_inputs; i++) { 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fs->info.input_semantic_name[i] == TGSI_SEMANTIC_GENERIC) { 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int generic_index = fs->info.input_semantic_index[i]; 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note that sprite_coord enable is a bitfield of 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * PIPE_MAX_SHADER_OUTPUTS bits. 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (generic_index < PIPE_MAX_SHADER_OUTPUTS && 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (rast->sprite_coord_enable & (1 << generic_index))) { 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* OK, this generic attribute needs to be replaced with a 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texcoord (see above). 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int slot = draw_alloc_extra_vertex_attrib(draw, 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_SEMANTIC_GENERIC, 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org generic_index); 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* add this slot to the texcoord-gen list */ 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wide->texcoord_gen_slot[wide->num_texcoord_gen++] = slot; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wide->psize_slot = -1; 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rast->point_size_per_vertex) { 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* find PSIZ vertex output */ 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct draw_vertex_shader *vs = draw->vs.vertex_shader; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < vs->info.num_outputs; i++) { 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_PSIZE) { 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wide->psize_slot = i; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stage->point( stage, header ); 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void widepoint_flush( struct draw_stage *stage, unsigned flags ) 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_context *draw = stage->draw; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = draw->pipe; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stage->point = widepoint_first_point; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stage->next->flush( stage->next, flags ); 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_remove_extra_vertex_attribs(draw); 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* restore original rasterizer state */ 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (draw->rast_handle) { 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->suspend_flushing = TRUE; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_rasterizer_state(pipe, draw->rast_handle); 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->suspend_flushing = FALSE; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void widepoint_reset_stipple_counter( struct draw_stage *stage ) 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stage->next->reset_stipple_counter( stage->next ); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void widepoint_destroy( struct draw_stage *stage ) 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_free_temp_verts( stage ); 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE( stage ); 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct draw_stage *draw_wide_point_stage( struct draw_context *draw ) 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct widepoint_stage *wide = CALLOC_STRUCT(widepoint_stage); 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (wide == NULL) 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wide->stage.draw = draw; 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wide->stage.name = "wide-point"; 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wide->stage.next = NULL; 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wide->stage.point = widepoint_first_point; 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wide->stage.line = draw_pipe_passthrough_line; 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wide->stage.tri = draw_pipe_passthrough_tri; 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wide->stage.flush = widepoint_flush; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wide->stage.reset_stipple_counter = widepoint_reset_stipple_counter; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wide->stage.destroy = widepoint_destroy; 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!draw_alloc_temp_verts( &wide->stage, 4 )) 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &wide->stage; 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fail: 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (wide) 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wide->stage.destroy( &wide->stage ); 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 337