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