1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010 Christoph Bumiller 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included in 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * all copies or substantial portions of the Software. 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NVC0_PUSH_EXPLICIT_SPACE_CHECKING 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h" 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h" 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "translate/translate.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nvc0_context.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nvc0_resource.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nvc0_3d.xml.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_vertex_state_delete(struct pipe_context *pipe, 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *hwcso) 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_vertex_stateobj *so = hwcso; 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (so->translate) 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->translate->release(so->translate); 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(hwcso); 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid * 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_vertex_state_create(struct pipe_context *pipe, 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_elements, 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_vertex_element *elements) 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_vertex_stateobj *so; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct translate_key transkey; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned src_offset_max = 0; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so = MALLOC(sizeof(*so) + 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_elements * sizeof(struct nvc0_vertex_element)); 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!so) 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->num_elements = num_elements; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->instance_elts = 0; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->instance_bufs = 0; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->shared_slots = FALSE; 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->need_conversion = FALSE; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(so->vb_access_size, 0, sizeof(so->vb_access_size)); 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < PIPE_MAX_ATTRIBS; ++i) 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->min_instance_div[i] = 0xffffffff; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transkey.nr_elements = 0; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transkey.output_stride = 0; 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < num_elements; ++i) { 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_vertex_element *ve = &elements[i]; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned vbi = ve->vertex_buffer_index; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format fmt = ve->src_format; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->element[i].pipe = elements[i]; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->element[i].state = nvc0_format_table[fmt].vtx; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!so->element[i].state) { 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (util_format_get_nr_components(fmt)) { 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: fmt = PIPE_FORMAT_R32_FLOAT; break; 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: fmt = PIPE_FORMAT_R32G32_FLOAT; break; 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: fmt = PIPE_FORMAT_R32G32B32_FLOAT; break; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: fmt = PIPE_FORMAT_R32G32B32A32_FLOAT; break; 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->element[i].state = nvc0_format_table[fmt].vtx; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->need_conversion = TRUE; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = util_format_get_blocksize(fmt); 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_offset_max = MAX2(src_offset_max, ve->src_offset); 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (so->vb_access_size[vbi] < (ve->src_offset + size)) 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->vb_access_size[vbi] = ve->src_offset + size; 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(ve->instance_divisor)) { 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->instance_elts |= 1 << i; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->instance_bufs |= 1 << vbi; 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ve->instance_divisor < so->min_instance_div[vbi]) 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->min_instance_div[vbi] = ve->instance_divisor; 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (1) { 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned ca; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned j = transkey.nr_elements++; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ca = util_format_description(fmt)->channel[0].size / 8; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ca != 1 && ca != 2) 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ca = 4; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transkey.element[j].type = TRANSLATE_ELEMENT_NORMAL; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transkey.element[j].input_format = ve->src_format; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transkey.element[j].input_buffer = vbi; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transkey.element[j].input_offset = ve->src_offset; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transkey.element[j].instance_divisor = ve->instance_divisor; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transkey.output_stride = align(transkey.output_stride, ca); 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transkey.element[j].output_format = fmt; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transkey.element[j].output_offset = transkey.output_stride; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transkey.output_stride += size; 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->element[i].state_alt = so->element[i].state; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->element[i].state_alt |= transkey.element[j].output_offset << 7; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->element[i].state |= i << NVC0_3D_VERTEX_ATTRIB_FORMAT_BUFFER__SHIFT; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transkey.output_stride = align(transkey.output_stride, 4); 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->size = transkey.output_stride; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->translate = translate_create(&transkey); 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (so->instance_elts || src_offset_max >= (1 << 14)) 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return so; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->shared_slots = TRUE; 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < num_elements; ++i) { 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned b = elements[i].vertex_buffer_index; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned s = elements[i].src_offset; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->element[i].state &= ~NVC0_3D_VERTEX_ATTRIB_FORMAT_BUFFER__MASK; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->element[i].state |= b << NVC0_3D_VERTEX_ATTRIB_FORMAT_BUFFER__SHIFT; 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->element[i].state |= s << NVC0_3D_VERTEX_ATTRIB_FORMAT_OFFSET__SHIFT; 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return so; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NVC0_3D_VERTEX_ATTRIB_INACTIVE \ 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_3D_VERTEX_ATTRIB_FORMAT_TYPE_FLOAT | \ 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_3D_VERTEX_ATTRIB_FORMAT_SIZE_32 | NVC0_3D_VERTEX_ATTRIB_FORMAT_CONST 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VTX_ATTR(a, c, t, s) \ 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((NVC0_3D_VTX_ATTR_DEFINE_TYPE_##t) | \ 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (NVC0_3D_VTX_ATTR_DEFINE_SIZE_##s) | \ 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((a) << NVC0_3D_VTX_ATTR_DEFINE_ATTR__SHIFT) | \ 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((c) << NVC0_3D_VTX_ATTR_DEFINE_COMP__SHIFT)) 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_set_constant_vertex_attrib(struct nvc0_context *nvc0, const unsigned a) 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_element *ve = &nvc0->vertex->element[a].pipe; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_buffer *vb = &nvc0->vtxbuf[ve->vertex_buffer_index]; 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t mode; 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc; 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *dst; 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *src = (const uint8_t *)vb->user_buffer + ve->src_offset; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!vb->buffer); 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc = util_format_description(ve->src_format); 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, 6); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VTX_ATTR_DEFINE), 5); 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst = &push->cur[1]; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->channel[0].pure_integer) { 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->channel[0].type == UTIL_FORMAT_TYPE_SIGNED) { 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode = VTX_ATTR(a, 4, SINT, 32); 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc->unpack_rgba_sint(dst, 0, src, 0, 1, 1); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode = VTX_ATTR(a, 4, UINT, 32); 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc->unpack_rgba_uint(dst, 0, src, 0, 1, 1); 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode = VTX_ATTR(a, 4, FLOAT, 32); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc->unpack_rgba_float(dst, 0, src, 0, 1, 1); 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org push->cur[0] = mode; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org push->cur += 5; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_user_vbuf_range(struct nvc0_context *nvc0, int vbi, 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *base, uint32_t *size) 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(nvc0->vertex->instance_bufs & (1 << vbi))) { 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint32_t div = nvc0->vertex->min_instance_div[vbi]; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *base = nvc0->instance_off * nvc0->vtxbuf[vbi].stride; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *size = (nvc0->instance_max / div) * nvc0->vtxbuf[vbi].stride + 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->vertex->vb_access_size[vbi]; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* NOTE: if there are user buffers, we *must* have index bounds */ 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(nvc0->vb_elt_limit != ~0); 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *base = nvc0->vb_elt_first * nvc0->vtxbuf[vbi].stride; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *size = nvc0->vb_elt_limit * nvc0->vtxbuf[vbi].stride + 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->vertex->vb_access_size[vbi]; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_release_user_vbufs(struct nvc0_context *nvc0) 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->vbo_user) { 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_VTX_TMP); 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_scratch_done(&nvc0->base); 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_update_user_vbufs(struct nvc0_context *nvc0) 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t address[PIPE_MAX_ATTRIBS]; 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t written = 0; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, nvc0->vertex->num_elements * 8); 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < nvc0->vertex->num_elements; ++i) { 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_element *ve = &nvc0->vertex->element[i].pipe; 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned b = ve->vertex_buffer_index; 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_buffer *vb = &nvc0->vtxbuf[b]; 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t base, size; 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(nvc0->vbo_user & (1 << b))) 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!vb->stride) { 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_set_constant_vertex_attrib(nvc0, i); 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_user_vbuf_range(nvc0, b, &base, &size); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(written & (1 << b))) { 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_bo *bo; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint32_t bo_flags = NOUVEAU_BO_RD | NOUVEAU_BO_GART; 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org written |= 1 << b; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org address[b] = nouveau_scratch_data(&nvc0->base, vb->user_buffer, 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org base, size, &bo); 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bo) 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BCTX_REFN_bo(nvc0->bufctx_3d, VTX_TMP, bo_flags, bo); 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_1IC0(push, NVC0_3D(MACRO_VERTEX_ARRAY_SELECT), 5); 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, i); 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, address[b] + base + size - 1); 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, address[b] + base + size - 1); 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, address[b] + ve->src_offset); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, address[b] + ve->src_offset); 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->base.vbo_dirty = TRUE; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_update_user_vbufs_shared(struct nvc0_context *nvc0) 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t mask = nvc0->vbo_user & ~nvc0->constant_vbos; 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, nvc0->num_vtxbufs * 8); 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (mask) { 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_bo *bo; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint32_t bo_flags = NOUVEAU_BO_RD | NOUVEAU_BO_GART; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t address; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t base, size; 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int b = ffs(mask) - 1; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask &= ~(1 << b); 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_user_vbuf_range(nvc0, b, &base, &size); 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org address = nouveau_scratch_data(&nvc0->base, nvc0->vtxbuf[b].user_buffer, 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org base, size, &bo); 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bo) 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BCTX_REFN_bo(nvc0->bufctx_3d, VTX_TMP, bo_flags, bo); 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_1IC0(push, NVC0_3D(MACRO_VERTEX_ARRAY_SELECT), 5); 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, b); 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, address + base + size - 1); 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, address + base + size - 1); 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, address); 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, address); 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = nvc0->state.constant_elts; 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (mask) { 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i = ffs(mask) - 1; 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask &= ~(1 << i); 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_set_constant_vertex_attrib(nvc0, i); 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_validate_vertex_buffers(struct nvc0_context *nvc0) 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct nvc0_vertex_stateobj *vertex = nvc0->vertex; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t refd = 0; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, vertex->num_elements * 8); 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < vertex->num_elements; ++i) { 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct nvc0_vertex_element *ve; 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_vertex_buffer *vb; 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv04_resource *res; 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned b; 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned limit, offset; 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->state.constant_elts & (1 << i)) 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ve = &vertex->element[i]; 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = ve->pipe.vertex_buffer_index; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb = &nvc0->vtxbuf[b]; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!vb->buffer) { 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vb->stride) { 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ve->pipe.instance_divisor) { 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VERTEX_ARRAY_DIVISOR(i)), 1); 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, ve->pipe.instance_divisor); 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VERTEX_ARRAY_FETCH(i)), 1); 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (1 << 12) | vb->stride); 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* address/value set in nvc0_update_user_vbufs */ 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = nv04_resource(vb->buffer); 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset = ve->pipe.src_offset + vb->buffer_offset; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org limit = vb->buffer->width0 - 1; 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(ve->pipe.instance_divisor)) { 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VERTEX_ARRAY_FETCH(i)), 4); 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (1 << 12) | vb->stride); 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, res->address + offset); 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, res->address + offset); 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, ve->pipe.instance_divisor); 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VERTEX_ARRAY_FETCH(i)), 3); 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (1 << 12) | vb->stride); 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, res->address + offset); 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, res->address + offset); 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VERTEX_ARRAY_LIMIT_HIGH(i)), 2); 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, res->address + limit); 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, res->address + limit); 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(refd & (1 << b))) { 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org refd |= 1 << b; 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BCTX_REFN(nvc0->bufctx_3d, VTX, res, RD); 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->vbo_user) 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_update_user_vbufs(nvc0); 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_validate_vertex_buffers_shared(struct nvc0_context *nvc0) 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned b; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint32_t mask = nvc0->vbo_user; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, nvc0->num_vtxbufs * 8); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (b = 0; b < nvc0->num_vtxbufs; ++b) { 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_buffer *vb = &nvc0->vtxbuf[b]; 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv04_resource *buf; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t offset, limit; 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & (1 << b)) { 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vb->stride) { 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VERTEX_ARRAY_FETCH(b)), 1); 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NVC0_3D_VERTEX_ARRAY_FETCH_ENABLE | vb->stride); 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* address/value set in nvc0_update_user_vbufs_shared */ 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf = nv04_resource(vb->buffer); 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset = vb->buffer_offset; 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org limit = buf->base.width0 - 1; 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VERTEX_ARRAY_FETCH(b)), 3); 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NVC0_3D_VERTEX_ARRAY_FETCH_ENABLE | vb->stride); 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, buf->address + offset); 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, buf->address + offset); 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VERTEX_ARRAY_LIMIT_HIGH(b)), 2); 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, buf->address + limit); 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, buf->address + limit); 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BCTX_REFN(nvc0->bufctx_3d, VTX, buf, RD); 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->vbo_user) 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_update_user_vbufs_shared(nvc0); 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_vertex_arrays_validate(struct nvc0_context *nvc0) 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_vertex_stateobj *vertex = nvc0->vertex; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_vertex_element *ve; 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t const_vbos; 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t vbo_mode; 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean update_vertex; 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_VTX); 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(vertex->need_conversion) || 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unlikely(nvc0->vertprog->vp.edgeflag < PIPE_MAX_ATTRIBS)) { 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vbo_mode = 3; 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vbo_mode = (nvc0->vbo_user && nvc0->vbo_push_hint) ? 1 : 0; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const_vbos = vbo_mode ? 0 : nvc0->constant_vbos; 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_vertex = (nvc0->dirty & NVC0_NEW_VERTEX) || 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (const_vbos != nvc0->state.constant_vbos) || 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (vbo_mode != nvc0->state.vbo_mode); 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (update_vertex) { 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned n = MAX2(vertex->num_elements, nvc0->state.num_vtxelts); 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->state.constant_vbos = const_vbos; 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->state.constant_elts = 0; 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->state.num_vtxelts = vertex->num_elements; 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->state.vbo_mode = vbo_mode; 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(vbo_mode)) { 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(nvc0->state.instance_elts & 3)) { 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* translate mode uses only 2 vertex buffers */ 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->state.instance_elts &= ~3; 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, 3); 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VERTEX_ARRAY_PER_INSTANCE(0)), 2); 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, n * 2 + 4); 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VERTEX_ATTRIB_FORMAT(0)), n); 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < vertex->num_elements; ++i) 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, vertex->element[i].state_alt); 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; i < n; ++i) 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, NVC0_3D_VERTEX_ATTRIB_INACTIVE); 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VERTEX_ARRAY_FETCH(0)), 1); 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (1 << 12) | vertex->size); 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 1; i < n; ++i) 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(push, NVC0_3D(VERTEX_ARRAY_FETCH(i)), 0); 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *restrict data; 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(vertex->instance_elts != nvc0->state.instance_elts)) { 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->state.instance_elts = vertex->instance_elts; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(n); /* if (n == 0), both masks should be 0 */ 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, 3); 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(MACRO_VERTEX_ARRAY_PER_INSTANCE), 2); 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, n); 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, vertex->instance_elts); 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, n * 2 + 1); 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VERTEX_ATTRIB_FORMAT(0)), n); 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data = push->cur; 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org push->cur += n; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < vertex->num_elements; ++i) { 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ve = &vertex->element[i]; 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data[i] = ve->state; 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(const_vbos & (1 << ve->pipe.vertex_buffer_index))) { 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->state.constant_elts |= 1 << i; 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data[i] |= NVC0_3D_VERTEX_ATTRIB_FORMAT_CONST; 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(push, NVC0_3D(VERTEX_ARRAY_FETCH(i)), 0); 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; i < n; ++i) { 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data[i] = NVC0_3D_VERTEX_ATTRIB_INACTIVE; 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(push, NVC0_3D(VERTEX_ARRAY_FETCH(i)), 0); 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->state.vbo_mode) /* using translate, don't set up arrays here */ 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vertex->shared_slots) 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_validate_vertex_buffers_shared(nvc0); 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_validate_vertex_buffers(nvc0); 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_idxbuf_validate(struct nvc0_context *nvc0) 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv04_resource *buf = nv04_resource(nvc0->idxbuf.buffer); 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(buf); 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(nouveau_resource_mapped_by_gpu(&buf->base)); 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, 6); 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(INDEX_ARRAY_START_HIGH), 5); 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, buf->address + nvc0->idxbuf.offset); 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, buf->address + nvc0->idxbuf.offset); 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, buf->address + buf->base.width0 - 1); 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, buf->address + buf->base.width0 - 1); 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, nvc0->idxbuf.index_size >> 1); 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BCTX_REFN(nvc0->bufctx_3d, IDX, buf, RD); 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NVC0_PRIM_GL_CASE(n) \ 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_PRIM_##n: return NVC0_3D_VERTEX_BEGIN_GL_PRIMITIVE_##n 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_prim_gl(unsigned prim) 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (prim) { 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(POINTS); 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(LINES); 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(LINE_LOOP); 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(LINE_STRIP); 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(TRIANGLES); 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(TRIANGLE_STRIP); 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(TRIANGLE_FAN); 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(QUADS); 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(QUAD_STRIP); 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(POLYGON); 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(LINES_ADJACENCY); 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(LINE_STRIP_ADJACENCY); 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(TRIANGLES_ADJACENCY); 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(TRIANGLE_STRIP_ADJACENCY); 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(PATCHES); */ 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NVC0_3D_VERTEX_BEGIN_GL_PRIMITIVE_POINTS; 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_draw_vbo_kick_notify(struct nouveau_pushbuf *push) 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_screen *screen = push->user_priv; 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_fence_update(&screen->base, TRUE); 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_draw_arrays(struct nvc0_context *nvc0, 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned mode, unsigned start, unsigned count, 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned instance_count) 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned prim; 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->state.index_bias) { 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, 1); 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(push, NVC0_3D(VB_ELEMENT_BASE), 0); 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->state.index_bias = 0; 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim = nvc0_prim_gl(mode); 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (instance_count--) { 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, 6); 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VERTEX_BEGIN_GL), 1); 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, prim); 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VERTEX_BUFFER_FIRST), 2); 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, start); 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, count); 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(push, NVC0_3D(VERTEX_END_GL), 0); 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim |= NVC0_3D_VERTEX_BEGIN_GL_INSTANCE_NEXT; 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_draw_elements_inline_u08(struct nouveau_pushbuf *push, const uint8_t *map, 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned start, unsigned count) 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map += start; 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (count & 3) { 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, 4); 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NIC0(push, NVC0_3D(VB_ELEMENT_U32), count & 3); 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < (count & 3); ++i) 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, *map++); 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count &= ~3; 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (count) { 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, nr = MIN2(count, NV04_PFIFO_MAX_PACKET_LEN * 4) / 4; 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, nr + 1); 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NIC0(push, NVC0_3D(VB_ELEMENT_U8), nr); 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < nr; ++i) { 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (map[3] << 24) | (map[2] << 16) | (map[1] << 8) | map[0]); 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map += 4; 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= nr * 4; 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_draw_elements_inline_u16(struct nouveau_pushbuf *push, const uint16_t *map, 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned start, unsigned count) 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map += start; 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (count & 1) { 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count &= ~1; 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, 2); 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VB_ELEMENT_U32), 1); 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, *map++); 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (count) { 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, nr = MIN2(count, NV04_PFIFO_MAX_PACKET_LEN * 2) / 2; 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, nr + 1); 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NIC0(push, NVC0_3D(VB_ELEMENT_U16), nr); 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < nr; ++i) { 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, (map[1] << 16) | map[0]); 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map += 2; 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= nr * 2; 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_draw_elements_inline_u32(struct nouveau_pushbuf *push, const uint32_t *map, 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned start, unsigned count) 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map += start; 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (count) { 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned nr = MIN2(count, NV04_PFIFO_MAX_PACKET_LEN); 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, nr + 1); 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NIC0(push, NVC0_3D(VB_ELEMENT_U32), nr); 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAp(push, map, nr); 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map += nr; 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= nr; 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_draw_elements_inline_u32_short(struct nouveau_pushbuf *push, 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint32_t *map, 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned start, unsigned count) 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map += start; 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (count & 1) { 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count--; 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, 1); 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VB_ELEMENT_U32), 1); 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, *map++); 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (count) { 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, nr = MIN2(count, NV04_PFIFO_MAX_PACKET_LEN * 2) / 2; 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, nr + 1); 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NIC0(push, NVC0_3D(VB_ELEMENT_U16), nr); 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < nr; ++i) { 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, (map[1] << 16) | map[0]); 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map += 2; 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= nr * 2; 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_draw_elements(struct nvc0_context *nvc0, boolean shorten, 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned mode, unsigned start, unsigned count, 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned instance_count, int32_t index_bias) 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned prim; 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned index_size = nvc0->idxbuf.index_size; 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim = nvc0_prim_gl(mode); 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index_bias != nvc0->state.index_bias) { 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, 2); 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VB_ELEMENT_BASE), 1); 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, index_bias); 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->state.index_bias = index_bias; 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->idxbuf.buffer) { 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, 1); 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(push, NVC0_3D(VERTEX_BEGIN_GL), prim); 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, 7); 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(INDEX_BATCH_FIRST), 2); 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, start); 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, count); 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (--instance_count) { 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VERTEX_END_GL), 2); 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, prim | NVC0_3D_VERTEX_BEGIN_GL_INSTANCE_NEXT); 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while (instance_count); 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(push, NVC0_3D(VERTEX_END_GL), 0); 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *data = nvc0->idxbuf.user_buffer; 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (instance_count--) { 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, 2); 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VERTEX_BEGIN_GL), 1); 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, prim); 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (index_size) { 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_draw_elements_inline_u08(push, data, start, count); 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_draw_elements_inline_u16(push, data, start, count); 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shorten) 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_draw_elements_inline_u32_short(push, data, start, count); 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_draw_elements_inline_u32(push, data, start, count); 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, 1); 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(push, NVC0_3D(VERTEX_END_GL), 0); 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim |= NVC0_3D_VERTEX_BEGIN_GL_INSTANCE_NEXT; 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_draw_stream_output(struct nvc0_context *nvc0, 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_draw_info *info) 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_so_target *so = nvc0_so_target(info->count_from_stream_output); 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv04_resource *res = nv04_resource(so->pipe.buffer); 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned mode = nvc0_prim_gl(info->mode); 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_instances = info->instance_count; 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (res->status & NOUVEAU_BUFFER_STATUS_GPU_WRITING) { 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res->status &= ~NOUVEAU_BUFFER_STATUS_GPU_WRITING; 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, 2); 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(push, NVC0_3D(SERIALIZE), 0); 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_query_fifo_wait(push, so->pq); 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(push, NVC0_3D(VERTEX_ARRAY_FLUSH), 0); 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (num_instances--) { 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, 8); 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VERTEX_BEGIN_GL), 1); 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, mode); 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(DRAW_TFB_BASE), 1); 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(DRAW_TFB_STRIDE), 1); 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, so->stride); 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(DRAW_TFB_BYTES), 1); 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_query_pushbuf_submit(push, so->pq, 0x4); 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(push, NVC0_3D(VERTEX_END_GL), 0); 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode |= NVC0_3D_VERTEX_BEGIN_GL_INSTANCE_NEXT; 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* NOTE: caller must ensure that (min_index + index_bias) is >= 0 */ 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->vb_elt_first = info->min_index + info->index_bias; 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->vb_elt_limit = info->max_index - info->min_index; 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->instance_off = info->start_instance; 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->instance_max = info->instance_count - 1; 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* For picking only a few vertices from a large user buffer, push is better, 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * if index count is larger and we expect repeated vertices, suggest upload. 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->vbo_push_hint = 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->indexed && (nvc0->vb_elt_limit >= (info->count * 2)); 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check whether we want to switch vertex-submission mode. */ 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->vbo_user && !(nvc0->dirty & (NVC0_NEW_ARRAYS | NVC0_NEW_VERTEX))) { 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->vbo_push_hint != !!nvc0->state.vbo_mode) 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->state.vbo_mode != 3) 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_ARRAYS; 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(nvc0->dirty & NVC0_NEW_ARRAYS) && nvc0->state.vbo_mode == 0) { 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->vertex->shared_slots) 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_update_user_vbufs_shared(nvc0); 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_update_user_vbufs(nvc0); 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 8 as minimum to avoid immediate double validation of new buffers */ 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_state_validate(nvc0, ~0, 8); 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org push->kick_notify = nvc0_draw_vbo_kick_notify; 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->state.vbo_mode) { 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_push_vbo(nvc0, info); 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org push->kick_notify = nvc0_default_kick_notify; 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* space for base instance, flush, and prim restart */ 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, 8); 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->state.instance_base != info->start_instance) { 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->state.instance_base = info->start_instance; 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* NOTE: this does not affect the shader input, should it ? */ 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VB_INSTANCE_BASE), 1); 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, info->start_instance); 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->base.vbo_dirty) { 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(push, NVC0_3D(VERTEX_ARRAY_FLUSH), 0); 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->base.vbo_dirty = FALSE; 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->indexed) { 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean shorten = info->max_index <= 65535; 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->primitive_restart != nvc0->state.prim_restart) { 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->primitive_restart) { 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(PRIM_RESTART_ENABLE), 2); 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, info->restart_index); 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->restart_index > 65535) 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shorten = FALSE; 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(push, NVC0_3D(PRIM_RESTART_ENABLE), 0); 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->state.prim_restart = info->primitive_restart; 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->primitive_restart) { 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(PRIM_RESTART_INDEX), 1); 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, info->restart_index); 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->restart_index > 65535) 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shorten = FALSE; 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_draw_elements(nvc0, shorten, 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->mode, info->start, info->count, 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->instance_count, info->index_bias); 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(info->count_from_stream_output)) { 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_draw_stream_output(nvc0, info); 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_draw_arrays(nvc0, 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->mode, info->start, info->count, 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->instance_count); 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org push->kick_notify = nvc0_default_kick_notify; 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_release_user_vbufs(nvc0); 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 881