107ef3e42451daa26fa5426026bcc4c89729644e0Brian/************************************************************************** 207ef3e42451daa26fa5426026bcc4c89729644e0Brian * 307ef3e42451daa26fa5426026bcc4c89729644e0Brian * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 407ef3e42451daa26fa5426026bcc4c89729644e0Brian * All Rights Reserved. 507ef3e42451daa26fa5426026bcc4c89729644e0Brian * 607ef3e42451daa26fa5426026bcc4c89729644e0Brian * Permission is hereby granted, free of charge, to any person obtaining a 707ef3e42451daa26fa5426026bcc4c89729644e0Brian * copy of this software and associated documentation files (the 807ef3e42451daa26fa5426026bcc4c89729644e0Brian * "Software"), to deal in the Software without restriction, including 907ef3e42451daa26fa5426026bcc4c89729644e0Brian * without limitation the rights to use, copy, modify, merge, publish, 1007ef3e42451daa26fa5426026bcc4c89729644e0Brian * distribute, sub license, and/or sell copies of the Software, and to 1107ef3e42451daa26fa5426026bcc4c89729644e0Brian * permit persons to whom the Software is furnished to do so, subject to 1207ef3e42451daa26fa5426026bcc4c89729644e0Brian * the following conditions: 1307ef3e42451daa26fa5426026bcc4c89729644e0Brian * 1407ef3e42451daa26fa5426026bcc4c89729644e0Brian * The above copyright notice and this permission notice (including the 1507ef3e42451daa26fa5426026bcc4c89729644e0Brian * next paragraph) shall be included in all copies or substantial portions 1607ef3e42451daa26fa5426026bcc4c89729644e0Brian * of the Software. 1707ef3e42451daa26fa5426026bcc4c89729644e0Brian * 1807ef3e42451daa26fa5426026bcc4c89729644e0Brian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1907ef3e42451daa26fa5426026bcc4c89729644e0Brian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2007ef3e42451daa26fa5426026bcc4c89729644e0Brian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2107ef3e42451daa26fa5426026bcc4c89729644e0Brian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2207ef3e42451daa26fa5426026bcc4c89729644e0Brian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2307ef3e42451daa26fa5426026bcc4c89729644e0Brian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2407ef3e42451daa26fa5426026bcc4c89729644e0Brian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2507ef3e42451daa26fa5426026bcc4c89729644e0Brian * 2607ef3e42451daa26fa5426026bcc4c89729644e0Brian **************************************************************************/ 2707ef3e42451daa26fa5426026bcc4c89729644e0Brian 2807ef3e42451daa26fa5426026bcc4c89729644e0Brian/** 2907ef3e42451daa26fa5426026bcc4c89729644e0Brian * State validation for vertex/fragment shaders. 3007ef3e42451daa26fa5426026bcc4c89729644e0Brian * Note that we have to delay most vertex/fragment shader translation 3107ef3e42451daa26fa5426026bcc4c89729644e0Brian * until rendering time since the linkage between the vertex outputs and 3207ef3e42451daa26fa5426026bcc4c89729644e0Brian * fragment inputs can vary depending on the pairing of shaders. 3307ef3e42451daa26fa5426026bcc4c89729644e0Brian * 3407ef3e42451daa26fa5426026bcc4c89729644e0Brian * Authors: 3507ef3e42451daa26fa5426026bcc4c89729644e0Brian * Brian Paul 3607ef3e42451daa26fa5426026bcc4c89729644e0Brian */ 3707ef3e42451daa26fa5426026bcc4c89729644e0Brian 3807ef3e42451daa26fa5426026bcc4c89729644e0Brian#include "main/imports.h" 3907ef3e42451daa26fa5426026bcc4c89729644e0Brian#include "main/mtypes.h" 40ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/program.h" 4107ef3e42451daa26fa5426026bcc4c89729644e0Brian 4207ef3e42451daa26fa5426026bcc4c89729644e0Brian#include "pipe/p_context.h" 4307ef3e42451daa26fa5426026bcc4c89729644e0Brian 441a82d9648b3db780e58e4966924157542d148c58Brian Paul#include "util/u_simple_shaders.h" 451a82d9648b3db780e58e4966924157542d148c58Brian Paul 46339e7ec6805e6de8794514c0a935081b5d36d38fBrian#include "cso_cache/cso_context.h" 47ac95fee4fffee77bb7bd798d094ed2e3a7c4019bBrian 4807ef3e42451daa26fa5426026bcc4c89729644e0Brian#include "st_context.h" 4907ef3e42451daa26fa5426026bcc4c89729644e0Brian#include "st_atom.h" 5007ef3e42451daa26fa5426026bcc4c89729644e0Brian#include "st_program.h" 5107ef3e42451daa26fa5426026bcc4c89729644e0Brian 5207ef3e42451daa26fa5426026bcc4c89729644e0Brian 53935fdbe1420277aa0c97b21c7944aa988bfbdddeBrian Paul/** 54935fdbe1420277aa0c97b21c7944aa988bfbdddeBrian Paul * Return pointer to a pass-through fragment shader. 55935fdbe1420277aa0c97b21c7944aa988bfbdddeBrian Paul * This shader is used when a texture is missing/incomplete. 56935fdbe1420277aa0c97b21c7944aa988bfbdddeBrian Paul */ 571a82d9648b3db780e58e4966924157542d148c58Brian Paulstatic void * 581a82d9648b3db780e58e4966924157542d148c58Brian Paulget_passthrough_fs(struct st_context *st) 591a82d9648b3db780e58e4966924157542d148c58Brian Paul{ 601a82d9648b3db780e58e4966924157542d148c58Brian Paul if (!st->passthrough_fs) { 611a82d9648b3db780e58e4966924157542d148c58Brian Paul st->passthrough_fs = 62fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell util_make_fragment_passthrough_shader(st->pipe); 631a82d9648b3db780e58e4966924157542d148c58Brian Paul } 641a82d9648b3db780e58e4966924157542d148c58Brian Paul 651a82d9648b3db780e58e4966924157542d148c58Brian Paul return st->passthrough_fs; 661a82d9648b3db780e58e4966924157542d148c58Brian Paul} 671a82d9648b3db780e58e4966924157542d148c58Brian Paul 68935fdbe1420277aa0c97b21c7944aa988bfbdddeBrian Paul 69935fdbe1420277aa0c97b21c7944aa988bfbdddeBrian Paul/** 70935fdbe1420277aa0c97b21c7944aa988bfbdddeBrian Paul * Update fragment program state/atom. This involves translating the 71935fdbe1420277aa0c97b21c7944aa988bfbdddeBrian Paul * Mesa fragment program into a gallium fragment program and binding it. 72935fdbe1420277aa0c97b21c7944aa988bfbdddeBrian Paul */ 7307ef3e42451daa26fa5426026bcc4c89729644e0Brianstatic void 7407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellupdate_fp( struct st_context *st ) 7507ef3e42451daa26fa5426026bcc4c89729644e0Brian{ 7607ef3e42451daa26fa5426026bcc4c89729644e0Brian struct st_fragment_program *stfp; 77aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant_key key; 7807ef3e42451daa26fa5426026bcc4c89729644e0Brian 79cc0b55c242e9f53a8e45c5d4392f964af44f396eBrian assert(st->ctx->FragmentProgram._Current); 80cc0b55c242e9f53a8e45c5d4392f964af44f396eBrian stfp = st_fragment_program(st->ctx->FragmentProgram._Current); 81a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul assert(stfp->Base.Base.Target == GL_FRAGMENT_PROGRAM_ARB); 8207ef3e42451daa26fa5426026bcc4c89729644e0Brian 833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul memset(&key, 0, sizeof(key)); 843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul key.st = st; 853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 86bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák /* _NEW_FRAG_CLAMP */ 87bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák key.clamp_color = st->clamp_frag_color_in_shader && 8803b78ceb50b97611bcaa2d2354ff5b505306b0a1Marek Olšák st->ctx->Color._ClampFragmentColor && 8903b78ceb50b97611bcaa2d2354ff5b505306b0a1Marek Olšák !st->ctx->DrawBuffer->_IntegerColor; 90bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák 91aa5ba96d294698809186cc4b59034abbd3076812Brian Paul st->fp_variant = st_get_fp_variant(st, stfp, &key); 9207ef3e42451daa26fa5426026bcc4c89729644e0Brian 93a56a59ce74b7f18f25a13992d2a2c1ae7cf973ceBrian Paul st_reference_fragprog(st, &st->fp, stfp); 94339e7ec6805e6de8794514c0a935081b5d36d38fBrian 951a82d9648b3db780e58e4966924157542d148c58Brian Paul if (st->missing_textures) { 961a82d9648b3db780e58e4966924157542d148c58Brian Paul /* use a pass-through frag shader that uses no textures */ 971a82d9648b3db780e58e4966924157542d148c58Brian Paul void *fs = get_passthrough_fs(st); 981a82d9648b3db780e58e4966924157542d148c58Brian Paul cso_set_fragment_shader_handle(st->cso_context, fs); 991a82d9648b3db780e58e4966924157542d148c58Brian Paul } 1001a82d9648b3db780e58e4966924157542d148c58Brian Paul else { 1013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul cso_set_fragment_shader_handle(st->cso_context, 102aa5ba96d294698809186cc4b59034abbd3076812Brian Paul st->fp_variant->driver_shader); 1031a82d9648b3db780e58e4966924157542d148c58Brian Paul } 10407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell} 10507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 106935fdbe1420277aa0c97b21c7944aa988bfbdddeBrian Paul 10707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellconst struct st_tracked_state st_update_fp = { 10807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell "st_update_fp", /* name */ 10907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell { /* dirty */ 11003b78ceb50b97611bcaa2d2354ff5b505306b0a1Marek Olšák _NEW_BUFFERS, /* mesa */ 11107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell ST_NEW_FRAGMENT_PROGRAM /* st */ 11207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell }, 11307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell update_fp /* update */ 11407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell}; 11507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 11607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 11707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 118935fdbe1420277aa0c97b21c7944aa988bfbdddeBrian Paul/** 119935fdbe1420277aa0c97b21c7944aa988bfbdddeBrian Paul * Update vertex program state/atom. This involves translating the 120935fdbe1420277aa0c97b21c7944aa988bfbdddeBrian Paul * Mesa vertex program into a gallium fragment program and binding it. 121935fdbe1420277aa0c97b21c7944aa988bfbdddeBrian Paul */ 12207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellstatic void 12307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellupdate_vp( struct st_context *st ) 12407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{ 12507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp; 126aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant_key key; 12707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 12807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell /* find active shader and params -- Should be covered by 12907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * ST_NEW_VERTEX_PROGRAM 13007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell */ 13107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell assert(st->ctx->VertexProgram._Current); 13207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp = st_vertex_program(st->ctx->VertexProgram._Current); 13307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell assert(stvp->Base.Base.Target == GL_VERTEX_PROGRAM_ARB); 13407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 1353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul memset(&key, 0, sizeof key); 1363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul key.st = st; /* variants are per-context */ 1373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* When this is true, we will add an extra input to the vertex 1393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * shader translation (for edgeflags), an extra output with 1403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * edgeflag semantics, and extend the vertex shader to pass through 1413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the input to the output. We'll need to use similar logic to set 1423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * up the extra vertex_element input for edgeflags. 1433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * _NEW_POLYGON, ST_NEW_EDGEFLAGS_DATA 1443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 1453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul key.passthrough_edgeflags = (st->vertdata_edgeflags && ( 1463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st->ctx->Polygon.FrontMode != GL_FILL || 1473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st->ctx->Polygon.BackMode != GL_FILL)); 1483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 149bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák key.clamp_color = st->clamp_vert_color_in_shader && 150bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák st->ctx->Light._ClampVertexColor; 151bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák 152aa5ba96d294698809186cc4b59034abbd3076812Brian Paul st->vp_variant = st_get_vp_variant(st, stvp, &key); 15307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 15407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell st_reference_vertprog(st, &st->vp, stvp); 15507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 15607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell cso_set_vertex_shader_handle(st->cso_context, 157aa5ba96d294698809186cc4b59034abbd3076812Brian Paul st->vp_variant->driver_shader); 15807ef3e42451daa26fa5426026bcc4c89729644e0Brian 15907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell st->vertex_result_to_slot = stvp->result_to_output; 16007ef3e42451daa26fa5426026bcc4c89729644e0Brian} 16107ef3e42451daa26fa5426026bcc4c89729644e0Brian 16207ef3e42451daa26fa5426026bcc4c89729644e0Brian 16307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellconst struct st_tracked_state st_update_vp = { 16407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell "st_update_vp", /* name */ 16554507125e735ffa595e252282eaabf38095c21e1Alan Hourihane { /* dirty */ 1661aba413a702cad3da04cf6d686ce81dd6330f1a9Roland Scheidegger _NEW_POLYGON, /* mesa */ 167420ff89067515a74c9625a103cadc267d5f64bd4Roland Scheidegger ST_NEW_VERTEX_PROGRAM | ST_NEW_EDGEFLAGS_DATA /* st */ 16807ef3e42451daa26fa5426026bcc4c89729644e0Brian }, 1693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul update_vp /* update */ 17007ef3e42451daa26fa5426026bcc4c89729644e0Brian}; 171da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 1723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 174da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinstatic void 175da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinupdate_gp( struct st_context *st ) 176da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{ 177da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin struct st_geometry_program *stgp; 178aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant_key key; 179da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 180da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (!st->ctx->GeometryProgram._Current) { 181da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin cso_set_geometry_shader_handle(st->cso_context, NULL); 182da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin return; 183da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 184da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 185da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp = st_geometry_program(st->ctx->GeometryProgram._Current); 186da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(stgp->Base.Base.Target == MESA_GEOMETRY_PROGRAM); 187da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 1883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul memset(&key, 0, sizeof(key)); 1893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul key.st = st; 1903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 191aa5ba96d294698809186cc4b59034abbd3076812Brian Paul st->gp_variant = st_get_gp_variant(st, stgp, &key); 192da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 193da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin st_reference_geomprog(st, &st->gp, stgp); 194da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 1953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul cso_set_geometry_shader_handle(st->cso_context, 196aa5ba96d294698809186cc4b59034abbd3076812Brian Paul st->gp_variant->driver_shader); 197da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin} 198da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 199da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinconst struct st_tracked_state st_update_gp = { 2003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul "st_update_gp", /* name */ 2013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { /* dirty */ 2023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 0, /* mesa */ 2033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ST_NEW_GEOMETRY_PROGRAM /* st */ 204da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin }, 2053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul update_gp /* update */ 206da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin}; 207