128d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul/************************************************************************** 250ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul * 3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2007 VMware, Inc. 428d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * All Rights Reserved. 550ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul * 628d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a 728d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * copy of this software and associated documentation files (the 828d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * "Software"), to deal in the Software without restriction, including 928d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * without limitation the rights to use, copy, modify, merge, publish, 1028d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * distribute, sub license, and/or sell copies of the Software, and to 1128d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * permit persons to whom the Software is furnished to do so, subject to 1228d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * the following conditions: 1350ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul * 1428d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * The above copyright notice and this permission notice (including the 1528d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * next paragraph) shall be included in all copies or substantial portions 1628d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * of the Software. 1750ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul * 1828d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1928d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2028d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 2228d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2328d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2428d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2550ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul * 2628d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul **************************************************************************/ 2728d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul 2828d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul /* 2928d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * Authors: 30877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Keith Whitwell <keithw@vmware.com> 3128d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul * Brian Paul 3228d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul */ 3350ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul 3428d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul 350b10ec1086d90de45ca2fab7b7b212508f50d1aaIlia Mirkin#include "main/context.h" 36853d4807fe220b17cf5af5a76b24f2466238013bMichal Krol#include "main/macros.h" 371f32c665c8af0622e2bbf451edb999ffbcd7d0feEric Anholt#include "main/mtypes.h" 381f32c665c8af0622e2bbf451edb999ffbcd7d0feEric Anholt#include "main/samplerobj.h" 3958e8dd6b9da69905c169cea07562c71a06a88270Brian Paul#include "main/teximage.h" 40ea2aca036c742474cda03e3b7012b188a14d0287Brian Paul#include "main/texobj.h" 41ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_instruction.h" 42853d4807fe220b17cf5af5a76b24f2466238013bMichal Krol 4328d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul#include "st_context.h" 4428d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul#include "st_atom.h" 456963f94e98e9b0a1432bc0071d495c9e31b899aeBrian Paul#include "st_sampler_view.h" 4658edb0683db45c449b219988a8715cf8fd69e42dBrian Paul#include "st_texture.h" 47a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie#include "st_format.h" 4828d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul#include "st_cb_texture.h" 4928d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul#include "pipe/p_context.h" 50e794fac35a9639d87a4ebd785e1e6b84490090efMarek Olšák#include "util/u_format.h" 5128486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 52332b77b852905224741084c5a4f5d2f4625dd119Brian Paul#include "cso_cache/cso_context.h" 53332b77b852905224741084c5a4f5d2f4625dd119Brian Paul 54f579a05a9f3962728e86b858deee97f9dca30f20Brian Paul 55c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airliestatic GLboolean 5650ad155d48c2be9d78c18573745d5a1f68368fadBrian Paulupdate_single_texture(struct st_context *st, 5750ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul struct pipe_sampler_view **sampler_view, 58768b4a25b95b95989dae3ff2f5a06172a2f4ab85Marek Olšák GLuint texUnit, unsigned glsl_version) 59c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie{ 6099feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul struct gl_context *ctx = st->ctx; 61c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie const struct gl_sampler_object *samp; 62c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie struct gl_texture_object *texObj; 63c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie struct st_texture_object *stObj; 64c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie GLboolean retval; 65c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie 6699feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul samp = _mesa_get_samplerobj(ctx, texUnit); 67c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie 6899feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul texObj = ctx->Texture.Unit[texUnit]._Current; 69c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie 70c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie if (!texObj) { 71ea2aca036c742474cda03e3b7012b188a14d0287Brian Paul texObj = _mesa_get_fallback_texture(ctx, TEXTURE_2D_INDEX); 72c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie samp = &texObj->Sampler; 73c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie } 74c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie stObj = st_texture_object(texObj); 75c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie 76c0e343f995c1af592eacd2709aa9a4d585a35e68Michal Srb retval = st_finalize_texture(ctx, st->pipe, texObj, 0); 77c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie if (!retval) { 78c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie /* out of mem */ 79c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie return GL_FALSE; 80c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie } 81c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie 82e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul /* Check a few pieces of state outside the texture object to see if we 83e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul * need to force revalidation. 84e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul */ 85e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul if (stObj->prev_glsl_version != glsl_version || 86e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul stObj->prev_sRGBDecode != samp->sRGBDecode) { 87e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul 88e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul st_texture_release_all_sampler_views(st, stObj); 89e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul 90e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul stObj->prev_glsl_version = glsl_version; 91e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul stObj->prev_sRGBDecode = samp->sRGBDecode; 92e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul } 93ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark 94768b4a25b95b95989dae3ff2f5a06172a2f4ab85Marek Olšák *sampler_view = 95e5cc84dd43be066c1dd418e32f5ad258e31a150aBrian Paul st_get_texture_sampler_view_from_stobj(st, stObj, samp, glsl_version); 96c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie return GL_TRUE; 97c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie} 98f579a05a9f3962728e86b858deee97f9dca30f20Brian Paul 9950ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul 1002aac0d145a3f03572f19fd913bed2e951d543030Brian Paul 10150ad155d48c2be9d78c18573745d5a1f68368fadBrian Paulstatic void 1022aac0d145a3f03572f19fd913bed2e951d543030Brian Paulupdate_textures(struct st_context *st, 103768b4a25b95b95989dae3ff2f5a06172a2f4ab85Marek Olšák gl_shader_stage mesa_shader, 1042aac0d145a3f03572f19fd913bed2e951d543030Brian Paul const struct gl_program *prog, 1052aac0d145a3f03572f19fd913bed2e951d543030Brian Paul unsigned max_units, 1062aac0d145a3f03572f19fd913bed2e951d543030Brian Paul struct pipe_sampler_view **sampler_views, 1072aac0d145a3f03572f19fd913bed2e951d543030Brian Paul unsigned *num_textures) 10828d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul{ 1092aac0d145a3f03572f19fd913bed2e951d543030Brian Paul const GLuint old_max = *num_textures; 1102aac0d145a3f03572f19fd913bed2e951d543030Brian Paul GLbitfield samplers_used = prog->SamplersUsed; 111ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark GLbitfield free_slots = ~prog->SamplersUsed; 112ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark GLbitfield external_samplers_used = prog->ExternalSamplersUsed; 1131454f894ff0df7eb3021584f0d1c1baa70444da5Timothy Arceri GLuint unit; 114532db3b7881f3dfcd299320cbf44443d06b88373Kai Wasserbäch enum pipe_shader_type shader_stage = st_shader_stage_to_ptarget(mesa_shader); 115c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie 116dd6aafcf72e79d7caacd4406528da9b2003915daBrian Paul if (samplers_used == 0x0 && old_max == 0) 117833a33bf6e085a79ec74c5f296a8e55ebec9f9b5Dave Airlie return; 118833a33bf6e085a79ec74c5f296a8e55ebec9f9b5Dave Airlie 1192aac0d145a3f03572f19fd913bed2e951d543030Brian Paul *num_textures = 0; 120c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie 121c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie /* loop over sampler units (aka tex image units) */ 1222aac0d145a3f03572f19fd913bed2e951d543030Brian Paul for (unit = 0; unit < max_units; unit++, samplers_used >>= 1) { 123c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie struct pipe_sampler_view *sampler_view = NULL; 124dd6aafcf72e79d7caacd4406528da9b2003915daBrian Paul 125dd6aafcf72e79d7caacd4406528da9b2003915daBrian Paul if (samplers_used & 1) { 1263477f67057f11b3608366f7096f4c6f1c57db509Marek Olšák /* prog->sh.data is NULL if it's ARB_fragment_program */ 1273477f67057f11b3608366f7096f4c6f1c57db509Marek Olšák unsigned glsl_version = prog->sh.data ? prog->sh.data->Version : 0; 1282aac0d145a3f03572f19fd913bed2e951d543030Brian Paul const GLuint texUnit = prog->SamplerUnits[unit]; 129c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie GLboolean retval; 130c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie 131768b4a25b95b95989dae3ff2f5a06172a2f4ab85Marek Olšák retval = update_single_texture(st, &sampler_view, texUnit, 1323477f67057f11b3608366f7096f4c6f1c57db509Marek Olšák glsl_version); 13333ca21fc3ca78d9e93d2a750b6da3505346d2b86Morgan Armand if (retval == GL_FALSE) 13433ca21fc3ca78d9e93d2a750b6da3505346d2b86Morgan Armand continue; 135c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie 1362aac0d145a3f03572f19fd913bed2e951d543030Brian Paul *num_textures = unit + 1; 1372aac0d145a3f03572f19fd913bed2e951d543030Brian Paul } 1382aac0d145a3f03572f19fd913bed2e951d543030Brian Paul else if (samplers_used == 0 && unit >= old_max) { 139dd6aafcf72e79d7caacd4406528da9b2003915daBrian Paul /* if we've reset all the old views and we have no more new ones */ 140dd6aafcf72e79d7caacd4406528da9b2003915daBrian Paul break; 141c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie } 142dd6aafcf72e79d7caacd4406528da9b2003915daBrian Paul 1432aac0d145a3f03572f19fd913bed2e951d543030Brian Paul pipe_sampler_view_reference(&(sampler_views[unit]), sampler_view); 144c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie } 145c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie 146ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark /* For any external samplers with multiplaner YUV, stuff the additional 147ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark * sampler views we need at the end. 148ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark * 149ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark * Trying to cache the sampler view in the stObj looks painful, so just 150ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark * re-create the sampler view for the extra planes each time. Main use 151ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark * case is video playback (ie. fps games wouldn't be using this) so I 152ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark * guess no point to try to optimize this feature. 153ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark */ 154ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark while (unlikely(external_samplers_used)) { 155ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark GLuint unit = u_bit_scan(&external_samplers_used); 156ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark GLuint extra = 0; 157ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark struct st_texture_object *stObj = 158ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark st_get_texture_object(st->ctx, prog, unit); 159ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark struct pipe_sampler_view tmpl; 160ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark 161ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark if (!stObj) 162ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark continue; 163ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark 164ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark /* use original view as template: */ 165ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark tmpl = *sampler_views[unit]; 166ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark 167ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark switch (st_get_view_format(stObj)) { 168ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark case PIPE_FORMAT_NV12: 169ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark /* we need one additional R8G8 view: */ 170ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark tmpl.format = PIPE_FORMAT_RG88_UNORM; 171ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark tmpl.swizzle_g = PIPE_SWIZZLE_Y; /* tmpl from Y plane is R8 */ 172ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark extra = u_bit_scan(&free_slots); 173ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark sampler_views[extra] = 174ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark st->pipe->create_sampler_view(st->pipe, stObj->pt->next, &tmpl); 175ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark break; 176ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark case PIPE_FORMAT_IYUV: 177ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark /* we need two additional R8 views: */ 178ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark tmpl.format = PIPE_FORMAT_R8_UNORM; 179ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark extra = u_bit_scan(&free_slots); 180ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark sampler_views[extra] = 181ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark st->pipe->create_sampler_view(st->pipe, stObj->pt->next, &tmpl); 182ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark extra = u_bit_scan(&free_slots); 183ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark sampler_views[extra] = 184ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark st->pipe->create_sampler_view(st->pipe, stObj->pt->next->next, &tmpl); 185ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark break; 186ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark default: 187ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark break; 188ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark } 189ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark 190ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark *num_textures = MAX2(*num_textures, extra + 1); 191ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark } 192ecd6fce2611e88ff8468a354cff8eda39f260a31Rob Clark 1932aac0d145a3f03572f19fd913bed2e951d543030Brian Paul cso_set_sampler_views(st->cso_context, 1942aac0d145a3f03572f19fd913bed2e951d543030Brian Paul shader_stage, 1951454f894ff0df7eb3021584f0d1c1baa70444da5Timothy Arceri *num_textures, 1962aac0d145a3f03572f19fd913bed2e951d543030Brian Paul sampler_views); 197c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie} 198c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie 19950ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul 2002aac0d145a3f03572f19fd913bed2e951d543030Brian Paul 20150ad155d48c2be9d78c18573745d5a1f68368fadBrian Paulstatic void 2022aac0d145a3f03572f19fd913bed2e951d543030Brian Paulupdate_vertex_textures(struct st_context *st) 203c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie{ 20499feecc7d1d0a6efb2511859973d6029d9fed9fdBrian Paul const struct gl_context *ctx = st->ctx; 20523c52caafba52c77092b9721bd4601f8ea592625Dave Airlie 20684732a982c3eeaca2e2809532c8422dc5f7045c1Paul Berry if (ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits > 0) { 2072aac0d145a3f03572f19fd913bed2e951d543030Brian Paul update_textures(st, 208768b4a25b95b95989dae3ff2f5a06172a2f4ab85Marek Olšák MESA_SHADER_VERTEX, 20981faead818a0b2fde131df019f5dfb0baef49273Timothy Arceri ctx->VertexProgram._Current, 21084732a982c3eeaca2e2809532c8422dc5f7045c1Paul Berry ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits, 2116c8a13215813841703e7c2efa233e8d4cf517dfdBrian Paul st->state.sampler_views[PIPE_SHADER_VERTEX], 2126c8a13215813841703e7c2efa233e8d4cf517dfdBrian Paul &st->state.num_sampler_views[PIPE_SHADER_VERTEX]); 2132aac0d145a3f03572f19fd913bed2e951d543030Brian Paul } 2142aac0d145a3f03572f19fd913bed2e951d543030Brian Paul} 2158f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 216c9aa3bbda44470c0a92c675abf4bbab83aba3fb7Dave Airlie 2172aac0d145a3f03572f19fd913bed2e951d543030Brian Paulstatic void 2182aac0d145a3f03572f19fd913bed2e951d543030Brian Paulupdate_fragment_textures(struct st_context *st) 2192aac0d145a3f03572f19fd913bed2e951d543030Brian Paul{ 2202aac0d145a3f03572f19fd913bed2e951d543030Brian Paul const struct gl_context *ctx = st->ctx; 2214528287e040415c2071012d02f20979ff995c754Keith Whitwell 2222aac0d145a3f03572f19fd913bed2e951d543030Brian Paul update_textures(st, 223768b4a25b95b95989dae3ff2f5a06172a2f4ab85Marek Olšák MESA_SHADER_FRAGMENT, 2243423488d55b9c483fcdb3996eb89b424c1031d24Timothy Arceri ctx->FragmentProgram._Current, 22584732a982c3eeaca2e2809532c8422dc5f7045c1Paul Berry ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits, 2266c8a13215813841703e7c2efa233e8d4cf517dfdBrian Paul st->state.sampler_views[PIPE_SHADER_FRAGMENT], 2276c8a13215813841703e7c2efa233e8d4cf517dfdBrian Paul &st->state.num_sampler_views[PIPE_SHADER_FRAGMENT]); 22828d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul} 22928d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul 23050ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul 231f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paulstatic void 232f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paulupdate_geometry_textures(struct st_context *st) 233f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul{ 234f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul const struct gl_context *ctx = st->ctx; 235f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul 236f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul if (ctx->GeometryProgram._Current) { 237f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul update_textures(st, 238768b4a25b95b95989dae3ff2f5a06172a2f4ab85Marek Olšák MESA_SHADER_GEOMETRY, 23992f77e9c01085c6babe6ce80dfe4e0e7abab61a1Timothy Arceri ctx->GeometryProgram._Current, 2400df3551bf43cbd37933464746670ff6814118f0dMarek Olšák ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits, 241f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul st->state.sampler_views[PIPE_SHADER_GEOMETRY], 242f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul &st->state.num_sampler_views[PIPE_SHADER_GEOMETRY]); 243f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul } 244f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul} 245f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul 246f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul 24740bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkinstatic void 24840bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkinupdate_tessctrl_textures(struct st_context *st) 24940bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin{ 25040bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin const struct gl_context *ctx = st->ctx; 25140bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin 25240bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin if (ctx->TessCtrlProgram._Current) { 25340bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin update_textures(st, 254768b4a25b95b95989dae3ff2f5a06172a2f4ab85Marek Olšák MESA_SHADER_TESS_CTRL, 25564d9773cfebded42691a70e3b233cadf896e53baTimothy Arceri ctx->TessCtrlProgram._Current, 25640bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxTextureImageUnits, 25740bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin st->state.sampler_views[PIPE_SHADER_TESS_CTRL], 25840bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin &st->state.num_sampler_views[PIPE_SHADER_TESS_CTRL]); 25940bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin } 26040bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin} 26140bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin 26240bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin 26340bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkinstatic void 26440bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkinupdate_tesseval_textures(struct st_context *st) 26540bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin{ 26640bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin const struct gl_context *ctx = st->ctx; 26740bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin 26840bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin if (ctx->TessEvalProgram._Current) { 26940bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin update_textures(st, 270768b4a25b95b95989dae3ff2f5a06172a2f4ab85Marek Olšák MESA_SHADER_TESS_EVAL, 27167c2d80a839614e4638d6cff390627122f8148caTimothy Arceri ctx->TessEvalProgram._Current, 27240bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxTextureImageUnits, 27340bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin st->state.sampler_views[PIPE_SHADER_TESS_EVAL], 27440bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin &st->state.num_sampler_views[PIPE_SHADER_TESS_EVAL]); 27540bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin } 27640bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin} 27740bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin 27840bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin 279805d92e54038255c145e464670d3352276ae27a9Samuel Pitoisetstatic void 280805d92e54038255c145e464670d3352276ae27a9Samuel Pitoisetupdate_compute_textures(struct st_context *st) 281805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset{ 282805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset const struct gl_context *ctx = st->ctx; 283805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset 284805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset if (ctx->ComputeProgram._Current) { 285805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset update_textures(st, 286805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset MESA_SHADER_COMPUTE, 2879605b98a078654f6f76e85221599e5fa8c073de6Timothy Arceri ctx->ComputeProgram._Current, 288805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits, 289805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset st->state.sampler_views[PIPE_SHADER_COMPUTE], 290805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset &st->state.num_sampler_views[PIPE_SHADER_COMPUTE]); 291805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset } 292805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset} 293805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset 294805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset 295f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paulconst struct st_tracked_state st_update_fragment_texture = { 296bb31ecf4fb5b2dc9bad801397562535bf38ccf9bDave Airlie update_fragment_textures /* update */ 297bb31ecf4fb5b2dc9bad801397562535bf38ccf9bDave Airlie}; 298bb31ecf4fb5b2dc9bad801397562535bf38ccf9bDave Airlie 29950ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul 300bb31ecf4fb5b2dc9bad801397562535bf38ccf9bDave Airlieconst struct st_tracked_state st_update_vertex_texture = { 301bb31ecf4fb5b2dc9bad801397562535bf38ccf9bDave Airlie update_vertex_textures /* update */ 30228d64d398bb3e04d20a9c03c9a0b92c0a7b9d6d4Brian Paul}; 3031a82d9648b3db780e58e4966924157542d148c58Brian Paul 30450ad155d48c2be9d78c18573745d5a1f68368fadBrian Paul 305f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paulconst struct st_tracked_state st_update_geometry_texture = { 306f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul update_geometry_textures /* update */ 307f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul}; 308f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul 309f3c3aff6efed49b7740a144f767c713cb22561e2Brian Paul 31040bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkinconst struct st_tracked_state st_update_tessctrl_texture = { 31140bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin update_tessctrl_textures /* update */ 31240bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin}; 31340bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin 31440bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin 31540bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkinconst struct st_tracked_state st_update_tesseval_texture = { 31640bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin update_tesseval_textures /* update */ 31740bc1c32d2fb42207ea860053045fa49e45d80b9Ilia Mirkin}; 318805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset 319805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset 320805d92e54038255c145e464670d3352276ae27a9Samuel Pitoisetconst struct st_tracked_state st_update_compute_texture = { 321805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset update_compute_textures /* update */ 322805d92e54038255c145e464670d3352276ae27a9Samuel Pitoiset}; 323