13192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/********************************************************** 23192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Copyright 2008-2009 VMware, Inc. All rights reserved. 33192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 43192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person 53192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * obtaining a copy of this software and associated documentation 63192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * files (the "Software"), to deal in the Software without 73192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * restriction, including without limitation the rights to use, copy, 83192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * modify, merge, publish, distribute, sublicense, and/or sell copies 93192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * of the Software, and to permit persons to whom the Software is 103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * furnished to do so, subject to the following conditions: 113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The above copyright notice and this permission notice shall be 133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * included in all copies or substantial portions of the Software. 143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SOFTWARE. 233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz **********************************************************/ 253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2628486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 27e33447aac62da5e7fe8f6a262cacaa97ce212ef5José Fonseca#include "util/u_memory.h" 283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_defines.h" 293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_math.h" 303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 31287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "svga_sampler_view.h" 323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_winsys.h" 333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_context.h" 343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_state.h" 353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_cmd.h" 363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid svga_cleanup_tss_binding(struct svga_context *svga) 393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz int i; 41f6106566081978f663cf08e54bb8908cb58a5316Michal Krol unsigned count = MAX2( svga->curr.num_sampler_views, 423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->state.hw_draw.num_views ); 433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for (i = 0; i < count; i++) { 453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_hw_view_state *view = &svga->state.hw_draw.views[i]; 463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_sampler_view_reference(&view->v, NULL); 48f6106566081978f663cf08e54bb8908cb58a5316Michal Krol pipe_sampler_view_reference( &svga->curr.sampler_views[i], NULL ); 49287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference( &view->texture, NULL ); 503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz view->dirty = 1; 523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 56369ece170257ef687ca609cacd1d66d186274eb3José Fonsecastruct bind_queue { 57369ece170257ef687ca609cacd1d66d186274eb3José Fonseca struct { 58369ece170257ef687ca609cacd1d66d186274eb3José Fonseca unsigned unit; 59369ece170257ef687ca609cacd1d66d186274eb3José Fonseca struct svga_hw_view_state *view; 60369ece170257ef687ca609cacd1d66d186274eb3José Fonseca } bind[PIPE_MAX_SAMPLERS]; 61369ece170257ef687ca609cacd1d66d186274eb3José Fonseca 62369ece170257ef687ca609cacd1d66d186274eb3José Fonseca unsigned bind_count; 63369ece170257ef687ca609cacd1d66d186274eb3José Fonseca}; 64369ece170257ef687ca609cacd1d66d186274eb3José Fonseca 65369ece170257ef687ca609cacd1d66d186274eb3José Fonseca 66e8f646fa7e9cf6f6793864384128157735aa03b3José Fonsecastatic enum pipe_error 673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzupdate_tss_binding(struct svga_context *svga, 683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned dirty ) 693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 706b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca boolean reemit = svga->rebind.texture_samplers; 713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned i; 72f6106566081978f663cf08e54bb8908cb58a5316Michal Krol unsigned count = MAX2( svga->curr.num_sampler_views, 733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->state.hw_draw.num_views ); 743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned min_lod; 753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned max_lod; 763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 77369ece170257ef687ca609cacd1d66d186274eb3José Fonseca struct bind_queue queue; 783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz queue.bind_count = 0; 803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for (i = 0; i < count; i++) { 823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct svga_sampler_state *s = svga->curr.sampler[i]; 833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_hw_view_state *view = &svga->state.hw_draw.views[i]; 84287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *texture = NULL; 85fd890873b20de553078fc96d977fbd858238c7d9Brian Paul struct pipe_sampler_view *sv = svga->curr.sampler_views[i]; 863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* get min max lod */ 88fd890873b20de553078fc96d977fbd858238c7d9Brian Paul if (sv) { 89fd890873b20de553078fc96d977fbd858238c7d9Brian Paul min_lod = MAX2(0, (s->view_min_lod + sv->u.tex.first_level)); 9083fed5e13081f2f5c7156f4f706eabbd6a87c5aeBrian Paul max_lod = MIN2(s->view_max_lod + sv->u.tex.first_level, 9183fed5e13081f2f5c7156f4f706eabbd6a87c5aeBrian Paul sv->texture->last_level); 92fd890873b20de553078fc96d977fbd858238c7d9Brian Paul texture = sv->texture; 933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } else { 943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz min_lod = 0; 953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz max_lod = 0; 963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 98f6106566081978f663cf08e54bb8908cb58a5316Michal Krol if (view->texture != texture || 993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz view->min_lod != min_lod || 1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz view->max_lod != max_lod) { 1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_sampler_view_reference(&view->v, NULL); 103287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference( &view->texture, texture ); 1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz view->dirty = TRUE; 1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz view->min_lod = min_lod; 1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz view->max_lod = max_lod; 1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 109f6106566081978f663cf08e54bb8908cb58a5316Michal Krol if (texture) 1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz view->v = svga_get_tex_sampler_view(&svga->pipe, 111f6106566081978f663cf08e54bb8908cb58a5316Michal Krol texture, 1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz min_lod, 1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz max_lod); 1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1165a70db643295e99ca3f821a34abe474d56a6c872José Fonseca /* 1175a70db643295e99ca3f821a34abe474d56a6c872José Fonseca * We need to reemit non-null texture bindings, even when they are not 1185a70db643295e99ca3f821a34abe474d56a6c872José Fonseca * dirty, to ensure that the resources are paged in. 1195a70db643295e99ca3f821a34abe474d56a6c872José Fonseca */ 1205a70db643295e99ca3f821a34abe474d56a6c872José Fonseca 1215a70db643295e99ca3f821a34abe474d56a6c872José Fonseca if (view->dirty || 1225a70db643295e99ca3f821a34abe474d56a6c872José Fonseca (reemit && view->v)) { 1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz queue.bind[queue.bind_count].unit = i; 1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz queue.bind[queue.bind_count].view = view; 1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz queue.bind_count++; 1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1275a70db643295e99ca3f821a34abe474d56a6c872José Fonseca if (!view->dirty && view->v) { 1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_validate_sampler_view(svga, view->v); 1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 132f6106566081978f663cf08e54bb8908cb58a5316Michal Krol svga->state.hw_draw.num_views = svga->curr.num_sampler_views; 1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (queue.bind_count) { 1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3dTextureState *ts; 1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (SVGA3D_BeginSetTextureState( svga->swc, 1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz &ts, 1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz queue.bind_count ) != PIPE_OK) 1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto fail; 1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for (i = 0; i < queue.bind_count; i++) { 14304094b2da2030a82ff49e647fc8658502f02cea8José Fonseca struct svga_winsys_surface *handle; 14404094b2da2030a82ff49e647fc8658502f02cea8José Fonseca 1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ts[i].stage = queue.bind[i].unit; 1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ts[i].name = SVGA3D_TS_BIND_TEXTURE; 1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (queue.bind[i].view->v) { 14904094b2da2030a82ff49e647fc8658502f02cea8José Fonseca handle = queue.bind[i].view->v->handle; 1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz else { 15204094b2da2030a82ff49e647fc8658502f02cea8José Fonseca handle = NULL; 1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 15404094b2da2030a82ff49e647fc8658502f02cea8José Fonseca svga->swc->surface_relocation(svga->swc, 15504094b2da2030a82ff49e647fc8658502f02cea8José Fonseca &ts[i].value, 15604094b2da2030a82ff49e647fc8658502f02cea8José Fonseca handle, 15704094b2da2030a82ff49e647fc8658502f02cea8José Fonseca SVGA_RELOC_READ); 1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz queue.bind[i].view->dirty = FALSE; 1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_FIFOCommitAll( svga->swc ); 1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1656b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca svga->rebind.texture_samplers = FALSE; 1666b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca 1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return 0; 1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzfail: 1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return PIPE_ERROR_OUT_OF_MEMORY; 1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 174369ece170257ef687ca609cacd1d66d186274eb3José Fonseca/* 175369ece170257ef687ca609cacd1d66d186274eb3José Fonseca * Rebind textures. 176369ece170257ef687ca609cacd1d66d186274eb3José Fonseca * 177369ece170257ef687ca609cacd1d66d186274eb3José Fonseca * Similar to update_tss_binding, but without any state checking/update. 178369ece170257ef687ca609cacd1d66d186274eb3José Fonseca * 179369ece170257ef687ca609cacd1d66d186274eb3José Fonseca * Called at the beginning of every new command buffer to ensure that 180369ece170257ef687ca609cacd1d66d186274eb3José Fonseca * non-dirty textures are properly paged-in. 181369ece170257ef687ca609cacd1d66d186274eb3José Fonseca */ 182369ece170257ef687ca609cacd1d66d186274eb3José Fonsecaenum pipe_error 183369ece170257ef687ca609cacd1d66d186274eb3José Fonsecasvga_reemit_tss_bindings(struct svga_context *svga) 184369ece170257ef687ca609cacd1d66d186274eb3José Fonseca{ 185369ece170257ef687ca609cacd1d66d186274eb3José Fonseca unsigned i; 186369ece170257ef687ca609cacd1d66d186274eb3José Fonseca enum pipe_error ret; 187369ece170257ef687ca609cacd1d66d186274eb3José Fonseca struct bind_queue queue; 188369ece170257ef687ca609cacd1d66d186274eb3José Fonseca 1896b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca assert(svga->rebind.texture_samplers); 1906b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca 191369ece170257ef687ca609cacd1d66d186274eb3José Fonseca queue.bind_count = 0; 192369ece170257ef687ca609cacd1d66d186274eb3José Fonseca 193369ece170257ef687ca609cacd1d66d186274eb3José Fonseca for (i = 0; i < svga->state.hw_draw.num_views; i++) { 194369ece170257ef687ca609cacd1d66d186274eb3José Fonseca struct svga_hw_view_state *view = &svga->state.hw_draw.views[i]; 195369ece170257ef687ca609cacd1d66d186274eb3José Fonseca 196369ece170257ef687ca609cacd1d66d186274eb3José Fonseca if (view->v) { 197369ece170257ef687ca609cacd1d66d186274eb3José Fonseca queue.bind[queue.bind_count].unit = i; 198369ece170257ef687ca609cacd1d66d186274eb3José Fonseca queue.bind[queue.bind_count].view = view; 199369ece170257ef687ca609cacd1d66d186274eb3José Fonseca queue.bind_count++; 200369ece170257ef687ca609cacd1d66d186274eb3José Fonseca } 201369ece170257ef687ca609cacd1d66d186274eb3José Fonseca } 202369ece170257ef687ca609cacd1d66d186274eb3José Fonseca 203369ece170257ef687ca609cacd1d66d186274eb3José Fonseca if (queue.bind_count) { 204369ece170257ef687ca609cacd1d66d186274eb3José Fonseca SVGA3dTextureState *ts; 205369ece170257ef687ca609cacd1d66d186274eb3José Fonseca 206369ece170257ef687ca609cacd1d66d186274eb3José Fonseca ret = SVGA3D_BeginSetTextureState(svga->swc, 207369ece170257ef687ca609cacd1d66d186274eb3José Fonseca &ts, 208369ece170257ef687ca609cacd1d66d186274eb3José Fonseca queue.bind_count); 209369ece170257ef687ca609cacd1d66d186274eb3José Fonseca if (ret != PIPE_OK) { 210369ece170257ef687ca609cacd1d66d186274eb3José Fonseca return ret; 211369ece170257ef687ca609cacd1d66d186274eb3José Fonseca } 212369ece170257ef687ca609cacd1d66d186274eb3José Fonseca 213369ece170257ef687ca609cacd1d66d186274eb3José Fonseca for (i = 0; i < queue.bind_count; i++) { 214369ece170257ef687ca609cacd1d66d186274eb3José Fonseca struct svga_winsys_surface *handle; 215369ece170257ef687ca609cacd1d66d186274eb3José Fonseca 216369ece170257ef687ca609cacd1d66d186274eb3José Fonseca ts[i].stage = queue.bind[i].unit; 217369ece170257ef687ca609cacd1d66d186274eb3José Fonseca ts[i].name = SVGA3D_TS_BIND_TEXTURE; 218369ece170257ef687ca609cacd1d66d186274eb3José Fonseca 219369ece170257ef687ca609cacd1d66d186274eb3José Fonseca assert(queue.bind[i].view->v); 220369ece170257ef687ca609cacd1d66d186274eb3José Fonseca handle = queue.bind[i].view->v->handle; 221369ece170257ef687ca609cacd1d66d186274eb3José Fonseca svga->swc->surface_relocation(svga->swc, 222369ece170257ef687ca609cacd1d66d186274eb3José Fonseca &ts[i].value, 223369ece170257ef687ca609cacd1d66d186274eb3José Fonseca handle, 224369ece170257ef687ca609cacd1d66d186274eb3José Fonseca SVGA_RELOC_READ); 225369ece170257ef687ca609cacd1d66d186274eb3José Fonseca } 226369ece170257ef687ca609cacd1d66d186274eb3José Fonseca 227369ece170257ef687ca609cacd1d66d186274eb3José Fonseca SVGA_FIFOCommitAll(svga->swc); 228369ece170257ef687ca609cacd1d66d186274eb3José Fonseca } 229369ece170257ef687ca609cacd1d66d186274eb3José Fonseca 2306b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca svga->rebind.texture_samplers = FALSE; 2316b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca 232369ece170257ef687ca609cacd1d66d186274eb3José Fonseca return PIPE_OK; 233369ece170257ef687ca609cacd1d66d186274eb3José Fonseca} 234369ece170257ef687ca609cacd1d66d186274eb3José Fonseca 235369ece170257ef687ca609cacd1d66d186274eb3José Fonseca 2363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_tracked_state svga_hw_tss_binding = { 2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "texture binding emit", 2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_TEXTURE_BINDING | 2396b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca SVGA_NEW_SAMPLER, 2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz update_tss_binding 2413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}; 2423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*********************************************************************** 2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct ts_queue { 2483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned ts_count; 2493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3dTextureState ts[PIPE_MAX_SAMPLERS*SVGA3D_TS_MAX]; 2503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}; 2513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define EMIT_TS(svga, unit, val, token, fail) \ 2543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzdo { \ 255e33447aac62da5e7fe8f6a262cacaa97ce212ef5José Fonseca assert(unit < Elements(svga->state.hw_draw.ts)); \ 256e33447aac62da5e7fe8f6a262cacaa97ce212ef5José Fonseca assert(SVGA3D_TS_##token < Elements(svga->state.hw_draw.ts[unit])); \ 2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->state.hw_draw.ts[unit][SVGA3D_TS_##token] != val) { \ 2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_queue_tss( &queue, unit, SVGA3D_TS_##token, val ); \ 2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->state.hw_draw.ts[unit][SVGA3D_TS_##token] = val; \ 2603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } \ 2613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} while (0) 2623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define EMIT_TS_FLOAT(svga, unit, fvalue, token, fail) \ 2643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzdo { \ 2653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned val = fui(fvalue); \ 266e33447aac62da5e7fe8f6a262cacaa97ce212ef5José Fonseca assert(unit < Elements(svga->state.hw_draw.ts)); \ 267e33447aac62da5e7fe8f6a262cacaa97ce212ef5José Fonseca assert(SVGA3D_TS_##token < Elements(svga->state.hw_draw.ts[unit])); \ 2683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->state.hw_draw.ts[unit][SVGA3D_TS_##token] != val) { \ 2693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_queue_tss( &queue, unit, SVGA3D_TS_##token, val ); \ 2703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->state.hw_draw.ts[unit][SVGA3D_TS_##token] = val; \ 2713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } \ 2723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} while (0) 2733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic INLINE void 2763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzsvga_queue_tss( struct ts_queue *q, 2773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned unit, 2783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned tss, 2793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned value ) 2803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(q->ts_count < sizeof(q->ts)/sizeof(q->ts[0])); 2823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz q->ts[q->ts_count].stage = unit; 2833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz q->ts[q->ts_count].name = tss; 2843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz q->ts[q->ts_count].value = value; 2853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz q->ts_count++; 2863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 289e8f646fa7e9cf6f6793864384128157735aa03b3José Fonsecastatic enum pipe_error 2903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzupdate_tss(struct svga_context *svga, 2913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned dirty ) 2923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned i; 2943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct ts_queue queue; 2953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz queue.ts_count = 0; 2973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for (i = 0; i < svga->curr.num_samplers; i++) { 2983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->curr.sampler[i]) { 2993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct svga_sampler_state *curr = svga->curr.sampler[i]; 3003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_TS(svga, i, curr->mipfilter, MIPFILTER, fail); 3023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_TS(svga, i, curr->min_lod, TEXTURE_MIPMAP_LEVEL, fail); 3033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_TS(svga, i, curr->magfilter, MAGFILTER, fail); 3043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_TS(svga, i, curr->minfilter, MINFILTER, fail); 3053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_TS(svga, i, curr->aniso_level, TEXTURE_ANISOTROPIC_LEVEL, fail); 3063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_TS_FLOAT(svga, i, curr->lod_bias, TEXTURE_LOD_BIAS, fail); 3073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_TS(svga, i, curr->addressu, ADDRESSU, fail); 3083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_TS(svga, i, curr->addressw, ADDRESSW, fail); 3093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_TS(svga, i, curr->bordercolor, BORDERCOLOR, fail); 3103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz // TEXCOORDINDEX -- hopefully not needed 3113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->curr.tex_flags.flag_1d & (1 << i)) { 3133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_TS(svga, i, SVGA3D_TEX_ADDRESS_WRAP, ADDRESSV, fail); 3143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 3153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz else 3163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_TS(svga, i, curr->addressv, ADDRESSV, fail); 3173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->curr.tex_flags.flag_srgb & (1 << i)) 3193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_TS_FLOAT(svga, i, 2.2f, GAMMA, fail); 3203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz else 3213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_TS_FLOAT(svga, i, 1.0f, GAMMA, fail); 3223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 3243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 3253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (queue.ts_count) { 3273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3dTextureState *ts; 3283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (SVGA3D_BeginSetTextureState( svga->swc, 3303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz &ts, 3313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz queue.ts_count ) != PIPE_OK) 3323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto fail; 3333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz memcpy( ts, 3353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz queue.ts, 3363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz queue.ts_count * sizeof queue.ts[0]); 3373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_FIFOCommitAll( svga->swc ); 3393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 3403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 341e8f646fa7e9cf6f6793864384128157735aa03b3José Fonseca return PIPE_OK; 3423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzfail: 3443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* XXX: need to poison cached hardware state on failure to ensure 3453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * dirty state gets re-emitted. Fix this by re-instating partial 3463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * FIFOCommit command and only updating cached hw state once the 3473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * initial allocation has succeeded. 3483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 3493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz memset(svga->state.hw_draw.ts, 0xcd, sizeof(svga->state.hw_draw.ts)); 3503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return PIPE_ERROR_OUT_OF_MEMORY; 3523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 3533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_tracked_state svga_hw_tss = { 3563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "texture state emit", 3573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz (SVGA_NEW_SAMPLER | 3583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_TEXTURE_FLAGS), 3593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz update_tss 3603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}; 3613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 362