1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008 Ben Skeggs 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010 Christoph Bumiller 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included in 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * all copies or substantial portions of the Software. 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE. 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h" 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h" 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h" 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_context.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_constbufs_validate(struct nv50_context *nv50) 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nv50->base.pushbuf; 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned s; 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (s = 0; s < 3; ++s) { 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned p; 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (s == PIPE_SHADER_FRAGMENT) 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p = NV50_3D_SET_PROGRAM_CB_PROGRAM_FRAGMENT; 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (s == PIPE_SHADER_GEOMETRY) 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p = NV50_3D_SET_PROGRAM_CB_PROGRAM_GEOMETRY; 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p = NV50_3D_SET_PROGRAM_CB_PROGRAM_VERTEX; 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (nv50->constbuf_dirty[s]) { 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int i = ffs(nv50->constbuf_dirty[s]) - 1; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50->constbuf_dirty[s] &= ~(1 << i); 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nv50->constbuf[s][i].user) { 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned b = NV50_CB_PVP + s; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned start = 0; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned words = nv50->constbuf[s][0].size / 4; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i) { 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_ERR("user constbufs only supported in slot 0\n"); 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!nv50->state.uniform_buffer_bound[s]) { 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50->state.uniform_buffer_bound[s] = TRUE; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(SET_PROGRAM_CB), 1); 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (b << 12) | (i << 8) | p | 1); 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (words) { 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!PUSH_SPACE(push, 16)) 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = PUSH_AVAIL(push); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(nr >= 16); 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2(MIN2(nr - 3, words), NV04_PFIFO_MAX_PACKET_LEN); 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(CB_ADDR), 1); 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (start << 8) | b); 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NI04(push, NV50_3D(CB_DATA(0)), nr); 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAp(push, &nv50->constbuf[s][0].u.data[start * 4], nr); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org start += nr; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org words -= nr; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv04_resource *res = 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv04_resource(nv50->constbuf[s][i].u.buf); 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (res) { 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO: allocate persistent bindings */ 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned b = s * 16 + i; 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(nouveau_resource_mapped_by_gpu(&res->base)); 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(CB_DEF_ADDRESS_HIGH), 3); 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, res->address + nv50->constbuf[s][i].offset); 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, res->address + nv50->constbuf[s][i].offset); 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (b << 16) | 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (nv50->constbuf[s][i].size & 0xffff)); 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(SET_PROGRAM_CB), 1); 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (b << 12) | (i << 8) | p | 1); 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BCTX_REFN(nv50->bufctx_3d, CB(s, i), res, RD); 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(SET_PROGRAM_CB), 1); 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (i << 8) | p | 0); 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 0) 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50->state.uniform_buffer_bound[s] = FALSE; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_program_validate(struct nv50_context *nv50, struct nv50_program *prog) 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!prog->translated) { 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog->translated = nv50_program_translate( 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog, nv50->screen->base.device->chipset); 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!prog->translated) 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prog->mem) 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return nv50_program_upload_code(nv50, prog); 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_program_update_context_state(struct nv50_context *nv50, 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_program *prog, int stage) 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_RDWR; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prog && prog->tls_space) { 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nv50->state.new_tls_space) 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_reset(nv50->bufctx_3d, NV50_BIND_TLS); 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!nv50->state.tls_required || nv50->state.new_tls_space) 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BCTX_REFN_bo(nv50->bufctx_3d, TLS, flags, nv50->screen->tls_bo); 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50->state.new_tls_space = FALSE; 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50->state.tls_required |= 1 << stage; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nv50->state.tls_required == (1 << stage)) 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_reset(nv50->bufctx_3d, NV50_BIND_TLS); 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50->state.tls_required &= ~(1 << stage); 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_vertprog_validate(struct nv50_context *nv50) 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nv50->base.pushbuf; 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_program *vp = nv50->vertprog; 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!nv50_program_validate(nv50, vp)) 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_program_update_context_state(nv50, vp, 0); 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(VP_ATTR_EN(0)), 2); 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, vp->vp.attrs[0]); 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, vp->vp.attrs[1]); 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(VP_REG_ALLOC_RESULT), 1); 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, vp->max_out); 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(VP_REG_ALLOC_TEMP), 1); 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, vp->max_gpr); 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(VP_START_ID), 1); 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, vp->code_base); 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_fragprog_validate(struct nv50_context *nv50) 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nv50->base.pushbuf; 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_program *fp = nv50->fragprog; 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!nv50_program_validate(nv50, fp)) 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_program_update_context_state(nv50, fp, 1); 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(FP_REG_ALLOC_TEMP), 1); 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, fp->max_gpr); 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(FP_RESULT_COUNT), 1); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, fp->max_out); 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(FP_CONTROL), 1); 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, fp->fp.flags[0]); 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(FP_CTRL_UNK196C), 1); 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, fp->fp.flags[1]); 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(FP_START_ID), 1); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, fp->code_base); 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_gmtyprog_validate(struct nv50_context *nv50) 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nv50->base.pushbuf; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_program *gp = nv50->gmtyprog; 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gp) { 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(GP_REG_ALLOC_TEMP), 1); 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, gp->max_gpr); 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(GP_REG_ALLOC_RESULT), 1); 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, gp->max_out); 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(GP_OUTPUT_PRIMITIVE_TYPE), 1); 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, gp->gp.prim_type); 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(GP_VERTEX_OUTPUT_COUNT), 1); 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, gp->gp.vert_count); 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(GP_START_ID), 1); 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, gp->code_base); 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50->state.prim_size = gp->gp.prim_type; /* enum matches vertex count */ 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_program_update_context_state(nv50, gp, 2); 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* GP_ENABLE is updated in linkage validation */ 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_sprite_coords_validate(struct nv50_context *nv50) 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nv50->base.pushbuf; 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t pntc[8], mode; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_program *fp = nv50->fragprog; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, c; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned m = (nv50->state.interpolant_ctrl >> 8) & 0xff; 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!nv50->rast->pipe.point_quad_rasterization) { 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nv50->state.point_sprite) { 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(POINT_COORD_REPLACE_MAP(0)), 8); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 8; ++i) 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, 0); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50->state.point_sprite = FALSE; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50->state.point_sprite = TRUE; 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(pntc, 0, sizeof(pntc)); 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < fp->in_nr; i++) { 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned n = util_bitcount(fp->in[i].mask); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fp->in[i].sn != TGSI_SEMANTIC_GENERIC) { 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m += n; 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(nv50->rast->pipe.sprite_coord_enable & (1 << fp->in[i].si))) { 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m += n; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < 4; ++c) { 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fp->in[i].mask & (1 << c)) { 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pntc[m / 8] |= (c + 1) << ((m % 8) * 4); 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++m; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nv50->rast->pipe.sprite_coord_mode == PIPE_SPRITE_COORD_LOWER_LEFT) 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode = 0x00; 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode = 0x10; 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(POINT_SPRITE_CTRL), 1); 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, mode); 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(POINT_COORD_REPLACE_MAP(0)), 8); 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAp(push, pntc, 8); 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Validate state derived from shaders and the rasterizer cso. */ 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_validate_derived_rs(struct nv50_context *nv50) 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nv50->base.pushbuf; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t color, psize; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_sprite_coords_validate(nv50); 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nv50->state.rasterizer_discard != nv50->rast->pipe.rasterizer_discard) { 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50->state.rasterizer_discard = nv50->rast->pipe.rasterizer_discard; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(RASTERIZE_ENABLE), 1); 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, !nv50->rast->pipe.rasterizer_discard); 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nv50->dirty & NV50_NEW_FRAGPROG) 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psize = nv50->state.semantic_psize & ~NV50_3D_SEMANTIC_PTSZ_PTSZ_EN__MASK; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color = nv50->state.semantic_color & ~NV50_3D_SEMANTIC_COLOR_CLMP_EN; 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nv50->rast->pipe.clamp_vertex_color) 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color |= NV50_3D_SEMANTIC_COLOR_CLMP_EN; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (color != nv50->state.semantic_color) { 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50->state.semantic_color = color; 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(SEMANTIC_COLOR), 1); 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, color); 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nv50->rast->pipe.point_size_per_vertex) 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psize |= NV50_3D_SEMANTIC_PTSZ_PTSZ_EN__MASK; 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (psize != nv50->state.semantic_psize) { 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50->state.semantic_psize = psize; 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(SEMANTIC_PTSZ), 1); 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, psize); 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_vec4_map(uint8_t *map, int mid, uint32_t lin[4], 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_varying *in, struct nv50_varying *out) 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int c; 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t mv = out->mask, mf = in->mask, oid = out->hw; 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < 4; ++c) { 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mf & 1) { 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (in->linear) 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lin[mid / 32] |= 1 << (mid % 32); 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mv & 1) 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map[mid] = oid; 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c == 3) 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map[mid] |= 1; 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++mid; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org oid += mv & 1; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mf >>= 1; 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mv >>= 1; 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return mid; 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_fp_linkage_validate(struct nv50_context *nv50) 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nv50->base.pushbuf; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_program *vp = nv50->gmtyprog ? nv50->gmtyprog : nv50->vertprog; 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_program *fp = nv50->fragprog; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_varying dummy; 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, n, c, m; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t primid = 0; 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t psiz = 0x000; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t interp = fp->fp.interp; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t colors = fp->fp.colors; 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t lin[4]; 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t map[64]; 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t so_map[64]; 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(nv50->dirty & (NV50_NEW_VERTPROG | 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_NEW_FRAGPROG | 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_NEW_GMTYPROG))) { 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t bfc, ffc; 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ffc = (nv50->state.semantic_color & NV50_3D_SEMANTIC_COLOR_FFC0_ID__MASK); 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bfc = (nv50->state.semantic_color & NV50_3D_SEMANTIC_COLOR_BFC0_ID__MASK) 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org >> 8; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nv50->rast->pipe.light_twoside == ((ffc == bfc) ? 0 : 1)) 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(lin, 0x00, sizeof(lin)); 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: in buggy-endian mode, is the first element of map (u32)0x000000xx 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * or is it the first byte ? 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(map, nv50->gmtyprog ? 0x80 : 0x40, sizeof(map)); 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dummy.mask = 0xf; /* map all components of HPOS */ 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dummy.linear = 0; 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m = nv50_vec4_map(map, 0, lin, &dummy, &vp->out[0]); 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < vp->vp.clpd_nr; ++c) 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map[m++] = vp->vp.clpd[c / 4] + (c % 4); 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colors |= m << 8; /* adjust BFC0 id */ 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dummy.mask = 0x0; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* if light_twoside is active, FFC0_ID == BFC0_ID is invalid */ 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nv50->rast->pipe.light_twoside) { 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 2; ++i) { 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org n = vp->vp.bfc[i]; 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fp->vp.bfc[i] >= fp->in_nr) 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m = nv50_vec4_map(map, m, lin, &fp->in[fp->vp.bfc[i]], 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (n < vp->out_nr) ? &vp->out[n] : &dummy); 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colors += m - 4; /* adjust FFC0 id */ 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org interp |= m << 8; /* set map id where 'normal' FP inputs start */ 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < fp->in_nr; ++i) { 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (n = 0; n < vp->out_nr; ++n) 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vp->out[n].sn == fp->in[i].sn && 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vp->out[n].si == fp->in[i].si) 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m = nv50_vec4_map(map, m, lin, 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &fp->in[i], (n < vp->out_nr) ? &vp->out[n] : &dummy); 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* PrimitiveID either is replaced by the system value, or 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * written by the geometry shader into an output register 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fp->gp.primid < 0x80) { 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org primid = m; 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map[m++] = vp->gp.primid; 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nv50->rast->pipe.point_size_per_vertex) { 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psiz = (m << 4) | 1; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map[m++] = vp->vp.psiz; 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nv50->rast->pipe.clamp_vertex_color) 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colors |= NV50_3D_SEMANTIC_COLOR_CLMP_EN; 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(vp->so)) { 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Slot i in STRMOUT_MAP specifies the offset where slot i in RESULT_MAP 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * gets written. 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TODO: 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Inverting vp->so->map (output -> offset) would probably speed this up. 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(so_map, 0, sizeof(so_map)); 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < vp->so->map_size; ++i) { 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vp->so->map[i] == 0xff) 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < m; ++c) 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (map[c] == vp->so->map[i] && !so_map[c]) 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c == m) { 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c = m; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map[m++] = vp->so->map[i]; 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so_map[c] = 0x80 | i; 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = m; c & 3; ++c) 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so_map[c] = 0; 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org n = (m + 3) / 4; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(m <= 64); 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(nv50->gmtyprog)) { 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(GP_RESULT_MAP_SIZE), 1); 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, m); 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(GP_RESULT_MAP(0)), n); 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAp(push, map, n); 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(VP_GP_BUILTIN_ATTR_EN), 1); 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, vp->vp.attrs[2]); 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(SEMANTIC_PRIM_ID), 1); 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, primid); 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(VP_RESULT_MAP_SIZE), 1); 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, m); 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(VP_RESULT_MAP(0)), n); 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAp(push, map, n); 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(SEMANTIC_COLOR), 4); 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, colors); 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (vp->vp.clpd_nr << 8) | 4); 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, psiz); 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(FP_INTERPOLANT_CTRL), 1); 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, interp); 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50->state.interpolant_ctrl = interp; 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50->state.semantic_color = colors; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50->state.semantic_psize = psiz; 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(NOPERSPECTIVE_BITMAP(0)), 4); 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAp(push, lin, 4); 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(GP_ENABLE), 1); 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, nv50->gmtyprog ? 1 : 0); 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vp->so) { 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(STRMOUT_MAP(0)), n); 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAp(push, so_map, n); 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_vp_gp_mapping(uint8_t *map, int m, 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_program *vp, struct nv50_program *gp) 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, j, c; 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < gp->in_nr; ++i) { 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t oid = 0, mv = 0, mg = gp->in[i].mask; 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < vp->out_nr; ++j) { 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vp->out[j].sn == gp->in[i].sn && 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vp->out[j].si == gp->in[i].si) { 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mv = vp->out[j].mask; 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org oid = vp->out[j].hw; 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < 4; ++c, mv >>= 1, mg >>= 1) { 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mg & mv & 1) 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map[m++] = oid; 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mg & 1) 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map[m++] = (c == 3) ? 0x41 : 0x40; 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org oid += mv & 1; 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return m; 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_gp_linkage_validate(struct nv50_context *nv50) 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nv50->base.pushbuf; 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_program *vp = nv50->vertprog; 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_program *gp = nv50->gmtyprog; 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int m = 0; 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int n; 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t map[64]; 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!gp) 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(map, 0, sizeof(map)); 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m = nv50_vp_gp_mapping(map, m, vp, gp); 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org n = (m + 3) / 4; 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(VP_GP_BUILTIN_ATTR_EN), 1); 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, vp->vp.attrs[2] | gp->vp.attrs[2]); 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(VP_RESULT_MAP_SIZE), 1); 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, m); 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(VP_RESULT_MAP(0)), n); 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAp(push, map, n); 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_stream_output_validate(struct nv50_context *nv50) 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nv50->base.pushbuf; 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_stream_output_state *so; 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t ctrl; 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned prims = ~0; 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so = nv50->gmtyprog ? nv50->gmtyprog->so : nv50->vertprog->so; 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(STRMOUT_ENABLE), 1); 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!so || !nv50->num_so_targets) { 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nv50->screen->base.class_3d < NVA0_3D_CLASS) { 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(STRMOUT_PRIMITIVE_LIMIT), 1); 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(STRMOUT_PARAMS_LATCH), 1); 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* previous TFB needs to complete */ 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nv50->screen->base.class_3d < NVA0_3D_CLASS) { 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, SUBC_3D(NV50_GRAPH_SERIALIZE), 1); 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctrl = so->ctrl; 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nv50->screen->base.class_3d >= NVA0_3D_CLASS) 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctrl |= NVA0_3D_STRMOUT_BUFFERS_CTRL_LIMIT_MODE_OFFSET; 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(STRMOUT_BUFFERS_CTRL), 1); 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, ctrl); 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_reset(nv50->bufctx_3d, NV50_BIND_SO); 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < nv50->num_so_targets; ++i) { 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_so_target *targ = nv50_so_target(nv50->so_target[i]); 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv04_resource *buf = nv04_resource(targ->pipe.buffer); 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned n = nv50->screen->base.class_3d >= NVA0_3D_CLASS ? 4 : 3; 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (n == 4 && !targ->clean) 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv84_query_fifo_wait(push, targ->pq); 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(STRMOUT_ADDRESS_HIGH(i)), n); 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, buf->address + targ->pipe.buffer_offset); 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, buf->address + targ->pipe.buffer_offset); 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, so->num_attribs[i]); 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (n == 4) { 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, targ->pipe.buffer_size); 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NVA0_3D(STRMOUT_OFFSET(i)), 1); 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!targ->clean) { 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(targ->pq); 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_query_pushbuf_submit(push, targ->pq, 0x4); 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, 0); 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org targ->clean = FALSE; 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned limit = targ->pipe.buffer_size / 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (so->stride[i] * nv50->state.prim_size); 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prims = MIN2(prims, limit); 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BCTX_REFN(nv50->bufctx_3d, SO, buf, WR); 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prims != ~0) { 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(STRMOUT_PRIMITIVE_LIMIT), 1); 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, prims); 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(STRMOUT_PARAMS_LATCH), 1); 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(STRMOUT_ENABLE), 1); 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 624