shaders_cache.c revision 301a9437cc5d89686391e5722b952f52df274ab3
1544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin/************************************************************************** 2544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 3544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * Copyright 2009 VMware, Inc. All Rights Reserved. 4544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 5544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * Permission is hereby granted, free of charge, to any person obtaining a 6544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * copy of this software and associated documentation files (the 7544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * "Software"), to deal in the Software without restriction, including 8544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * without limitation the rights to use, copy, modify, merge, publish, 9544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * distribute, sub license, and/or sell copies of the Software, and to 10544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * permit persons to whom the Software is furnished to do so, subject to 11544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * the following conditions: 12544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 13544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * The above copyright notice and this permission notice (including the 14544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * next paragraph) shall be included in all copies or substantial portions 15544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * of the Software. 16544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 17544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 21544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 25544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin **************************************************************************/ 26544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 27544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "shaders_cache.h" 28544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 29544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "vg_context.h" 30544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 31544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_context.h" 32544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_defines.h" 33544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_inlines.h" 34544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_screen.h" 35544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_shader_tokens.h" 36544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 37544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "tgsi/tgsi_build.h" 38544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "tgsi/tgsi_dump.h" 39544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "tgsi/tgsi_parse.h" 40544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "tgsi/tgsi_util.h" 41544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "tgsi/tgsi_text.h" 42544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 43544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_memory.h" 44544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_math.h" 45544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_debug.h" 46544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "cso_cache/cso_hash.h" 47544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "cso_cache/cso_context.h" 48544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 49544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "VG/openvg.h" 50544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 51544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "asm_fill.h" 52544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 53544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin/* Essentially we construct an ubber-shader based on the state 54544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * of the pipeline. The stages are: 55544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 1) Fill (mandatory, solid color/gradient/pattern/image draw) 56544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 2) Image composition (image mode multiply and stencil) 57544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 3) Mask 58544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 4) Extended blend (multiply/screen/darken/lighten) 59544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 5) Premultiply/Unpremultiply 60544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 6) Color transform (to black and white) 61544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin */ 62544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#define SHADER_STAGES 6 63544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 64544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct cached_shader { 65544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin void *driver_shader; 66544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct pipe_shader_state state; 67544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}; 68544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 69544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct shaders_cache { 70544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_context *pipe; 71544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 72544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct cso_hash *hash; 73544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}; 74544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 75544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 76544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic INLINE struct tgsi_token *tokens_from_assembly(const char *txt, int num_tokens) 77544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 78544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct tgsi_token *tokens; 79544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 80544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin tokens = (struct tgsi_token *) MALLOC(num_tokens * sizeof(tokens[0])); 81544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 82544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin tgsi_text_translate(txt, tokens, num_tokens); 83544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 84544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#if DEBUG_SHADERS 85544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin tgsi_dump(tokens, 0); 86544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#endif 87544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 88544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return tokens; 89544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 90544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 91544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#define ALL_FILLS (VEGA_SOLID_FILL_SHADER | \ 92544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VEGA_LINEAR_GRADIENT_SHADER | \ 93544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VEGA_RADIAL_GRADIENT_SHADER | \ 94544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VEGA_PATTERN_SHADER | \ 95544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VEGA_IMAGE_NORMAL_SHADER) 96544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 97544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 98544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin/* 99544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic const char max_shader_preamble[] = 1005285de7c0fc067dc036a5b421140a696ce2cabbfMichal Krol "FRAG\n" 101544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin "DCL IN[0], POSITION, LINEAR\n" 102544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin "DCL IN[1], GENERIC[0], PERSPECTIVE\n" 103544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin "DCL OUT[0], COLOR, CONSTANT\n" 104544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin "DCL CONST[0..9], CONSTANT\n" 105544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin "DCL TEMP[0..9], CONSTANT\n" 106544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin "DCL SAMP[0..9], CONSTANT\n"; 107544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 108544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin max_shader_preamble strlen == 175 109544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin*/ 110544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#define MAX_PREAMBLE 175 111544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 112544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic INLINE VGint range_min(VGint min, VGint current) 113544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 114544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (min < 0) 115544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin min = current; 116544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin else 117544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin min = MIN2(min, current); 118544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return min; 119544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 120544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 121544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic INLINE VGint range_max(VGint max, VGint current) 122544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 123544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return MAX2(max, current); 124544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 125544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 126301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveirastatic void * 127301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveiracombine_shaders(const struct shader_asm_info *shaders[SHADER_STAGES], int num_shaders, 128301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira struct pipe_context *pipe, 129301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira struct pipe_shader_state *shader) 130544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 131544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGboolean declare_input = VG_FALSE; 132544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint start_const = -1, end_const = 0; 133544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint start_temp = -1, end_temp = 0; 134544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint start_sampler = -1, end_sampler = 0; 135301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira VGint i, current_shader = 0; 136544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint num_consts, num_temps, num_samplers; 137301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira struct ureg_program *ureg; 138301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira struct ureg_src in[2]; 139301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira struct ureg_src *sampler = NULL; 140301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira struct ureg_src *constant = NULL; 141301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira struct ureg_dst out, *temp = NULL; 142301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira void *p = NULL; 143544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 144544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin for (i = 0; i < num_shaders; ++i) { 145544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (shaders[i]->num_consts) 146544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin start_const = range_min(start_const, shaders[i]->start_const); 147544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (shaders[i]->num_temps) 148544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin start_temp = range_min(start_temp, shaders[i]->start_temp); 149544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (shaders[i]->num_samplers) 150544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin start_sampler = range_min(start_sampler, shaders[i]->start_sampler); 151544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 152544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin end_const = range_max(end_const, shaders[i]->start_const + 153544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shaders[i]->num_consts); 154544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin end_temp = range_max(end_temp, shaders[i]->start_temp + 155544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shaders[i]->num_temps); 156544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin end_sampler = range_max(end_sampler, shaders[i]->start_sampler + 157544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shaders[i]->num_samplers); 158544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (shaders[i]->needs_position) 159544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin declare_input = VG_TRUE; 160544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 161544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* if they're still unitialized, initialize them */ 162544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (start_const < 0) 163544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin start_const = 0; 164544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (start_temp < 0) 165544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin start_temp = 0; 166544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (start_sampler < 0) 167301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira start_sampler = 0; 168544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 169544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin num_consts = end_const - start_const; 170544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin num_temps = end_temp - start_temp; 171544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin num_samplers = end_sampler - start_sampler; 172544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 173301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT); 174301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira if (!ureg) 175301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira return NULL; 176544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 177544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (declare_input) { 178301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira in[0] = ureg_DECL_fs_input(ureg, 179301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira TGSI_SEMANTIC_POSITION, 180301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira 0, 181301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira TGSI_INTERPOLATE_LINEAR); 182301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira in[1] = ureg_DECL_fs_input(ureg, 183301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira TGSI_SEMANTIC_GENERIC, 184301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira 0, 185301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira TGSI_INTERPOLATE_PERSPECTIVE); 186544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 187544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 188544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* we always have a color output */ 189301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira out = ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 0); 190544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 191301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira if (num_consts >= 1) { 192301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira constant = (struct ureg_src *) malloc(sizeof(struct ureg_src) * end_const); 193301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira for (i = start_const; i < end_const; i++) { 194301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira constant[i] = ureg_DECL_constant(ureg, i); 195301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira } 196544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 197544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 198544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 199301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira if (num_temps >= 1) { 200301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira temp = (struct ureg_dst *) malloc(sizeof(struct ureg_dst) * end_temp); 201301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira for (i = start_temp; i < end_temp; i++) { 202301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira temp[i] = ureg_DECL_temporary(ureg); 203301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira } 204301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira } 205544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 206301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira if (num_samplers >= 1) { 207301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira sampler = (struct ureg_src *) malloc(sizeof(struct ureg_src) * end_sampler); 208301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira for (i = start_sampler; i < end_sampler; i++) { 209301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira sampler[i] = ureg_DECL_sampler(ureg, i); 210301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira } 211301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira } 212544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 213544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin while (current_shader < num_shaders) { 214301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira if ((current_shader + 1) == num_shaders) { 215301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira shaders[current_shader]->func(ureg, 216301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira &out, 217301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira in, 218301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira sampler, 219301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira temp, 220301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira constant); 221301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira } else { 222301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira shaders[current_shader]->func(ureg, 223301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira &temp[0], 224301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira in, 225301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira sampler, 226301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira temp, 227301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira constant); 228301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira } 229301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira current_shader++; 230544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 231544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 232301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira ureg_END(ureg); 233544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 234301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira shader->tokens = ureg_finalize(ureg); 235301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira if(!shader->tokens) 236301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira return NULL; 237544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 238301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira p = pipe->create_fs_state(pipe, shader); 239301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira ureg_destroy(ureg); 240544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 241301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira if (num_temps >= 1) { 242301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira for (i = start_temp; i < end_temp; i++) { 243301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira ureg_release_temporary(ureg, temp[i]); 244301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira } 245301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira } 246544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 247301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira if (temp) 248301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira free(temp); 249301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira if (constant) 250301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira free(constant); 251301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira if (sampler) 252301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira free(sampler); 253544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 254301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira return p; 255544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 256544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 257544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic void * 258544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusincreate_shader(struct pipe_context *pipe, 259544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin int id, 260544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct pipe_shader_state *shader) 261544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 262544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin int idx = 0; 263544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin const struct shader_asm_info * shaders[SHADER_STAGES]; 264544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 265544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* the shader has to have a fill */ 266544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(id & ALL_FILLS); 267544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 268544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* first stage */ 269544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (id & VEGA_SOLID_FILL_SHADER) { 270544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(idx == 0); 271544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shaders[idx] = &shaders_asm[0]; 272544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(shaders_asm[0].id == VEGA_SOLID_FILL_SHADER); 273544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin ++idx; 274544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 275544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if ((id & VEGA_LINEAR_GRADIENT_SHADER)) { 276544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(idx == 0); 277544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shaders[idx] = &shaders_asm[1]; 278544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(shaders_asm[1].id == VEGA_LINEAR_GRADIENT_SHADER); 279544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin ++idx; 280544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 281544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if ((id & VEGA_RADIAL_GRADIENT_SHADER)) { 282544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(idx == 0); 283544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shaders[idx] = &shaders_asm[2]; 284544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(shaders_asm[2].id == VEGA_RADIAL_GRADIENT_SHADER); 285544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin ++idx; 286544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 287544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if ((id & VEGA_PATTERN_SHADER)) { 288544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(idx == 0); 289544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(shaders_asm[3].id == VEGA_PATTERN_SHADER); 290544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shaders[idx] = &shaders_asm[3]; 291544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin ++idx; 292544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 293544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if ((id & VEGA_IMAGE_NORMAL_SHADER)) { 294544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(idx == 0); 295544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(shaders_asm[4].id == VEGA_IMAGE_NORMAL_SHADER); 296544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shaders[idx] = &shaders_asm[4]; 297544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin ++idx; 298544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 299544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 300544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* second stage */ 301544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if ((id & VEGA_IMAGE_MULTIPLY_SHADER)) { 302544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(shaders_asm[5].id == VEGA_IMAGE_MULTIPLY_SHADER); 303544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shaders[idx] = &shaders_asm[5]; 304544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin ++idx; 305544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } else if ((id & VEGA_IMAGE_STENCIL_SHADER)) { 306544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(shaders_asm[6].id == VEGA_IMAGE_STENCIL_SHADER); 307544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shaders[idx] = &shaders_asm[6]; 308544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin ++idx; 309544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 310544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 311544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* third stage */ 312544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if ((id & VEGA_MASK_SHADER)) { 313544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(idx == 1); 314544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(shaders_asm[7].id == VEGA_MASK_SHADER); 315544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shaders[idx] = &shaders_asm[7]; 316544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin ++idx; 317544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 318544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 319544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* fourth stage */ 320544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if ((id & VEGA_BLEND_MULTIPLY_SHADER)) { 321544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(shaders_asm[8].id == VEGA_BLEND_MULTIPLY_SHADER); 322544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shaders[idx] = &shaders_asm[8]; 323544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin ++idx; 324544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } else if ((id & VEGA_BLEND_SCREEN_SHADER)) { 325544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(shaders_asm[9].id == VEGA_BLEND_SCREEN_SHADER); 326544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shaders[idx] = &shaders_asm[9]; 327544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin ++idx; 328544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } else if ((id & VEGA_BLEND_DARKEN_SHADER)) { 329544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(shaders_asm[10].id == VEGA_BLEND_DARKEN_SHADER); 330544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shaders[idx] = &shaders_asm[10]; 331544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin ++idx; 332544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } else if ((id & VEGA_BLEND_LIGHTEN_SHADER)) { 333544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(shaders_asm[11].id == VEGA_BLEND_LIGHTEN_SHADER); 334544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shaders[idx] = &shaders_asm[11]; 335544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin ++idx; 336544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 337544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 338544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* fifth stage */ 339544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if ((id & VEGA_PREMULTIPLY_SHADER)) { 340544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(shaders_asm[12].id == VEGA_PREMULTIPLY_SHADER); 341544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shaders[idx] = &shaders_asm[12]; 342544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin ++idx; 343544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } else if ((id & VEGA_UNPREMULTIPLY_SHADER)) { 344544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(shaders_asm[13].id == VEGA_UNPREMULTIPLY_SHADER); 345544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shaders[idx] = &shaders_asm[13]; 346544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin ++idx; 347544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 348544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 349544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* sixth stage */ 350544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if ((id & VEGA_BW_SHADER)) { 351544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(shaders_asm[14].id == VEGA_BW_SHADER); 352544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shaders[idx] = &shaders_asm[14]; 353544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin ++idx; 354544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 355544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 356544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return combine_shaders(shaders, idx, pipe, shader); 357544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 358544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 359544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin/*************************************************/ 360544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 361544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct shaders_cache * shaders_cache_create(struct vg_context *vg) 362544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 363544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct shaders_cache *sc = CALLOC_STRUCT(shaders_cache); 364544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 365544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin sc->pipe = vg; 366544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin sc->hash = cso_hash_create(); 367544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 368544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return sc; 369544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 370544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 371544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid shaders_cache_destroy(struct shaders_cache *sc) 372544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 373544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct cso_hash_iter iter = cso_hash_first_node(sc->hash); 374544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 375544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin while (!cso_hash_iter_is_null(iter)) { 376544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct cached_shader *cached = 377544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin (struct cached_shader *)cso_hash_iter_data(iter); 378544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin cso_delete_fragment_shader(sc->pipe->cso_context, 379544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin cached->driver_shader); 380544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin iter = cso_hash_erase(sc->hash, iter); 381544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 382544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 383544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin cso_hash_delete(sc->hash); 384544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin free(sc); 385544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 386544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 387544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid * shaders_cache_fill(struct shaders_cache *sc, 388544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin int shader_key) 389544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 390544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint key = shader_key; 391544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct cached_shader *cached; 392544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct cso_hash_iter iter = cso_hash_find(sc->hash, key); 393544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 394544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (cso_hash_iter_is_null(iter)) { 395544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin cached = CALLOC_STRUCT(cached_shader); 396544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin cached->driver_shader = create_shader(sc->pipe->pipe, key, &cached->state); 397544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 398544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin cso_hash_insert(sc->hash, key, cached); 399544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 400544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return cached->driver_shader; 401544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 402544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 403544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin cached = (struct cached_shader *)cso_hash_iter_data(iter); 404544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 405544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin assert(cached->driver_shader); 406544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return cached->driver_shader; 407544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 408544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 409544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct vg_shader * shader_create_from_text(struct pipe_context *pipe, 410544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin const char *txt, int num_tokens, 411544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin int type) 412544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 413544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_shader *shader = (struct vg_shader *)malloc( 414544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin sizeof(struct vg_shader)); 415544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct tgsi_token *tokens = tokens_from_assembly(txt, num_tokens); 416544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct pipe_shader_state state; 417544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 418544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin debug_assert(type == PIPE_SHADER_VERTEX || 419544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin type == PIPE_SHADER_FRAGMENT); 420544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 421544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin state.tokens = tokens; 422544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shader->type = type; 423544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shader->tokens = tokens; 424544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 425544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (type == PIPE_SHADER_FRAGMENT) 426544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shader->driver = pipe->create_fs_state(pipe, &state); 427544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin else 428544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shader->driver = pipe->create_vs_state(pipe, &state); 429544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return shader; 430544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 431544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 432544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vg_shader_destroy(struct vg_context *ctx, struct vg_shader *shader) 433544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 434544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (shader->type == PIPE_SHADER_FRAGMENT) 435544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin cso_delete_fragment_shader(ctx->cso_context, shader->driver); 436544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin else 437544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin cso_delete_vertex_shader(ctx->cso_context, shader->driver); 438544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin free(shader->tokens); 439544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin free(shader); 440544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 441