1a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs/* 2a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * Copyright 2012 Red Hat Inc. 3a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * 4a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * Permission is hereby granted, free of charge, to any person obtaining a 5a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * copy of this software and associated documentation files (the "Software"), 6a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * to deal in the Software without restriction, including without limitation 7a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * and/or sell copies of the Software, and to permit persons to whom the 9a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * Software is furnished to do so, subject to the following conditions: 10a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * 11a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * The above copyright notice and this permission notice shall be included in 12a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * all copies or substantial portions of the Software. 13a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * 14a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * SOFTWARE. 21a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * 22a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * Authors: Ben Skeggs 23a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * 24a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs */ 25a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 26a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "util/u_inlines.h" 27a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "nv30_context.h" 28a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 29a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsvoid 30a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv40_verttex_validate(struct nv30_context *nv30) 31a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 32a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nouveau_pushbuf *push = nv30->base.pushbuf; 33a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned dirty = nv30->vertprog.dirty_samplers; 34a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 35a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs while (dirty) { 36a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned unit = ffs(dirty) - 1; 37a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_sampler_view *sv = (void *)nv30->fragprog.textures[unit]; 38a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_sampler_state *ss = nv30->fragprog.samplers[unit]; 39a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 40a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (ss && sv) { 41a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } else { 42a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs BEGIN_NV04(push, NV40_3D(VTXTEX_ENABLE(unit)), 1); 43a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_DATA (push, 0); 44a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 45a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 46a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 47a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->vertprog.dirty_samplers = 0; 48a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 49a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 50a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic void 51a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv40_verttex_sampler_states_bind(struct pipe_context *pipe, 52a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned nr, void **hwcso) 53a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 54a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_context *nv30 = nv30_context(pipe); 55a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned i; 56a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 57a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs for (i = 0; i < nr; i++) { 58a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->vertprog.samplers[i] = hwcso[i]; 59a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->vertprog.dirty_samplers |= (1 << i); 60a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 61a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 62a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs for (; i < nv30->vertprog.num_samplers; i++) { 63a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->vertprog.samplers[i] = NULL; 64a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->vertprog.dirty_samplers |= (1 << i); 65a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 66a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 67a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->vertprog.num_samplers = nr; 68a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->dirty |= NV30_NEW_VERTTEX; 69a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 70a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 71a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 72a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic void 73a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv40_verttex_set_sampler_views(struct pipe_context *pipe, unsigned nr, 74a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct pipe_sampler_view **views) 75a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 76a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_context *nv30 = nv30_context(pipe); 77a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs unsigned i; 78a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 79a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs for (i = 0; i < nr; i++) { 80a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nouveau_bufctx_reset(nv30->bufctx, BUFCTX_VERTTEX(i)); 81a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs pipe_sampler_view_reference(&nv30->vertprog.textures[i], views[i]); 82a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->vertprog.dirty_samplers |= (1 << i); 83a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 84a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 85a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs for (; i < nv30->vertprog.num_textures; i++) { 86a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nouveau_bufctx_reset(nv30->bufctx, BUFCTX_VERTTEX(i)); 87a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs pipe_sampler_view_reference(&nv30->vertprog.textures[i], NULL); 88a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->vertprog.dirty_samplers |= (1 << i); 89a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 90a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 91a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->vertprog.num_textures = nr; 92a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->dirty |= NV30_NEW_VERTTEX; 93a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 94a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 95a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsvoid 96a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv40_verttex_init(struct pipe_context *pipe) 97a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 98a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs pipe->bind_vertex_sampler_states = nv40_verttex_sampler_states_bind; 99a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs pipe->set_vertex_sampler_views = nv40_verttex_set_sampler_views; 100a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 101