1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nvc0_context.h" 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_validate_zcull(struct nvc0_context *nvc0) 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state *fb = &nvc0->framebuffer; 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_surface *sf = nv50_surface(fb->zsbuf); 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_miptree *mt = nv50_miptree(sf->base.texture); 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_bo *bo = mt->base.bo; 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t size; 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t offset = align(mt->total_size, 1 << 17); 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, height; 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(mt->base.base.depth0 == 1 && mt->base.base.array_size < 2); 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = mt->total_size * 2; 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org height = align(fb->height, 32); 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width = fb->width % 224; 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width) 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width = fb->width + (224 - width); 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width = fb->width; 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(ZCULL_REGION), 1); 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(ZCULL_ADDRESS_HIGH), 2); 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, bo->offset + offset); 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, bo->offset + offset); 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset += 1 << 17; 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(ZCULL_LIMIT_HIGH), 2); 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, bo->offset + offset); 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, bo->offset + offset); 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, SUBC_3D(0x07e0), 2); 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, size); 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, size >> 16); 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, SUBC_3D(0x15c8), 1); /* bits 0x3 */ 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 2); 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(ZCULL_WIDTH), 4); 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, width); 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, height); 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(ZCULL_WINDOW_OFFSET_X), 2); 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(ZCULL_INVALIDATE), 1); 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_validate_fb(struct nvc0_context *nvc0) 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state *fb = &nvc0->framebuffer; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned ms_mode = NVC0_3D_MULTISAMPLE_MODE_MS1; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean serialize = FALSE; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_FB); 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(RT_CONTROL), 1); 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (076543210 << 4) | fb->nr_cbufs); 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(SCREEN_SCISSOR_HORIZ), 2); 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, fb->width << 16); 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, fb->height << 16); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < fb->nr_cbufs; ++i) { 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_surface *sf = nv50_surface(fb->cbufs[i]); 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv04_resource *res = nv04_resource(sf->base.texture); 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_bo *bo = res->bo; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(RT_ADDRESS_HIGH(i)), 9); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, res->address + sf->offset); 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, res->address + sf->offset); 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (likely(nouveau_bo_memtype(bo))) { 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_miptree *mt = nv50_miptree(sf->base.texture); 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(sf->base.texture->target != PIPE_BUFFER); 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, sf->width); 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, sf->height); 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, nvc0_format_table[sf->base.format].rt); 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, (mt->layout_3d << 16) | 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mt->level[sf->base.u.tex.level].tile_mode); 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, sf->base.u.tex.first_layer + sf->depth); 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, mt->layer_stride >> 2); 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, sf->base.u.tex.first_layer); 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ms_mode = mt->ms_mode; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (res->base.target == PIPE_BUFFER) { 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, 262144); 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, 1); 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, nv50_miptree(sf->base.texture)->level[0].pitch); 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, sf->height); 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, nvc0_format_table[sf->base.format].rt); 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, 1 << 12); 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, 1); 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, 0); 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, 0); 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_resource_fence(res, NOUVEAU_BO_WR); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!fb->zsbuf); 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (res->status & NOUVEAU_BUFFER_STATUS_GPU_READING) 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org serialize = TRUE; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res->status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res->status &= ~NOUVEAU_BUFFER_STATUS_GPU_READING; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* only register for writing, otherwise we'd always serialize here */ 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BCTX_REFN(nvc0->bufctx_3d, FB, res, WR); 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fb->zsbuf) { 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_miptree *mt = nv50_miptree(fb->zsbuf->texture); 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_surface *sf = nv50_surface(fb->zsbuf); 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int unk = mt->base.base.target == PIPE_TEXTURE_2D; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(ZETA_ADDRESS_HIGH), 5); 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, mt->base.address + sf->offset); 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, mt->base.address + sf->offset); 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, nvc0_format_table[fb->zsbuf->format].rt); 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, mt->level[sf->base.u.tex.level].tile_mode); 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, mt->layer_stride >> 2); 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(ZETA_ENABLE), 1); 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(ZETA_HORIZ), 3); 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, sf->width); 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, sf->height); 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (unk << 16) | 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (sf->base.u.tex.first_layer + sf->depth)); 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(ZETA_BASE_LAYER), 1); 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, sf->base.u.tex.first_layer); 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ms_mode = mt->ms_mode; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mt->base.status & NOUVEAU_BUFFER_STATUS_GPU_READING) 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org serialize = TRUE; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mt->base.status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mt->base.status &= ~NOUVEAU_BUFFER_STATUS_GPU_READING; 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BCTX_REFN(nvc0->bufctx_3d, FB, &mt->base, WR); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(ZETA_ENABLE), 1); 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(push, NVC0_3D(MULTISAMPLE_MODE), ms_mode); 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (serialize) 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(push, NVC0_3D(SERIALIZE), 0); 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_validate_blend_colour(struct nvc0_context *nvc0) 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(BLEND_COLOR(0)), 4); 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAf(push, nvc0->blend_colour.color[0]); 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAf(push, nvc0->blend_colour.color[1]); 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAf(push, nvc0->blend_colour.color[2]); 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAf(push, nvc0->blend_colour.color[3]); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_validate_stencil_ref(struct nvc0_context *nvc0) 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const ubyte *ref = &nvc0->stencil_ref.ref_value[0]; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(push, NVC0_3D(STENCIL_FRONT_FUNC_REF), ref[0]); 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(push, NVC0_3D(STENCIL_BACK_FUNC_REF), ref[1]); 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_validate_stipple(struct nvc0_context *nvc0) 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(POLYGON_STIPPLE_PATTERN(0)), 32); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 32; ++i) 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, util_bswap32(nvc0->stipple.stipple[i])); 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_validate_scissor(struct nvc0_context *nvc0) 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_scissor_state *s = &nvc0->scissor; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(nvc0->dirty & NVC0_NEW_SCISSOR) && 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->rast->pipe.scissor == nvc0->state.scissor) 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->state.scissor = nvc0->rast->pipe.scissor; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(SCISSOR_HORIZ(0)), 2); 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->rast->pipe.scissor) { 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, (s->maxx << 16) | s->minx); 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, (s->maxy << 16) | s->miny); 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, (0xffff << 16) | 0); 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA(push, (0xffff << 16) | 0); 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_validate_viewport(struct nvc0_context *nvc0) 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_viewport_state *vp = &nvc0->viewport; 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int x, y, w, h; 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float zmin, zmax; 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VIEWPORT_TRANSLATE_X(0)), 3); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAf(push, vp->translate[0]); 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAf(push, vp->translate[1]); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAf(push, vp->translate[2]); 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VIEWPORT_SCALE_X(0)), 3); 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAf(push, vp->scale[0]); 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAf(push, vp->scale[1]); 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAf(push, vp->scale[2]); 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* now set the viewport rectangle to viewport dimensions for clipping */ 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x = util_iround(MAX2(0.0f, vp->translate[0] - fabsf(vp->scale[0]))); 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y = util_iround(MAX2(0.0f, vp->translate[1] - fabsf(vp->scale[1]))); 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org w = util_iround(vp->translate[0] + fabsf(vp->scale[0])) - x; 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org h = util_iround(vp->translate[1] + fabsf(vp->scale[1])) - y; 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zmin = vp->translate[2] - fabsf(vp->scale[2]); 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zmax = vp->translate[2] + fabsf(vp->scale[2]); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(VIEWPORT_HORIZ(0)), 2); 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (w << 16) | x); 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (h << 16) | y); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(DEPTH_RANGE_NEAR(0)), 2); 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAf(push, zmin); 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAf(push, zmax); 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_upload_uclip_planes(struct nvc0_context *nvc0, unsigned s) 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_bo *bo = nvc0->screen->uniform_bo; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3); 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 512); 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, bo->offset + (5 << 16) + (s << 9)); 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, bo->offset + (5 << 16) + (s << 9)); 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_1IC0(push, NVC0_3D(CB_POS), PIPE_MAX_CLIP_PLANES * 4 + 1); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 256); 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAp(push, &nvc0->clip.ucp[0][0], PIPE_MAX_CLIP_PLANES * 4); 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_check_program_ucps(struct nvc0_context *nvc0, 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_program *vp, uint8_t mask) 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned n = util_logbase2(mask) + 1; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vp->vp.num_ucps >= n) 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_program_destroy(nvc0, vp); 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vp->vp.num_ucps = n; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (likely(vp == nvc0->vertprog)) 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_vertprog_validate(nvc0); 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (likely(vp == nvc0->gmtyprog)) 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_vertprog_validate(nvc0); 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_tevlprog_validate(nvc0); 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_validate_clip(struct nvc0_context *nvc0) 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_program *vp; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned stage; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t clip_enable = nvc0->rast->pipe.clip_plane_enable; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->gmtyprog) { 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stage = 3; 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vp = nvc0->gmtyprog; 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->tevlprog) { 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stage = 2; 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vp = nvc0->tevlprog; 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stage = 0; 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vp = nvc0->vertprog; 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (clip_enable && vp->vp.num_ucps < PIPE_MAX_CLIP_PLANES) 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_check_program_ucps(nvc0, vp, clip_enable); 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->dirty & (NVC0_NEW_CLIP | (NVC0_NEW_VERTPROG << stage))) 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vp->vp.num_ucps > 0 && vp->vp.num_ucps <= PIPE_MAX_CLIP_PLANES) 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_upload_uclip_planes(nvc0, stage); 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clip_enable &= vp->vp.clip_enable; 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->state.clip_enable != clip_enable) { 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->state.clip_enable = clip_enable; 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(push, NVC0_3D(CLIP_DISTANCE_ENABLE), clip_enable); 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->state.clip_mode != vp->vp.clip_mode) { 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->state.clip_mode = vp->vp.clip_mode; 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(CLIP_DISTANCE_MODE), 1); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, vp->vp.clip_mode); 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_validate_blend(struct nvc0_context *nvc0) 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, nvc0->blend->size); 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAp(push, nvc0->blend->state, nvc0->blend->size); 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_validate_zsa(struct nvc0_context *nvc0) 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, nvc0->zsa->size); 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAp(push, nvc0->zsa->state, nvc0->zsa->size); 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_validate_rasterizer(struct nvc0_context *nvc0) 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_SPACE(push, nvc0->rast->size); 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAp(push, nvc0->rast->state, nvc0->rast->size); 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_constbufs_validate(struct nvc0_context *nvc0) 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned s; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (s = 0; s < 5; ++s) { 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (nvc0->constbuf_dirty[s]) { 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i = ffs(nvc0->constbuf_dirty[s]) - 1; 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->constbuf_dirty[s] &= ~(1 << i); 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->constbuf[s][i].user) { 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_bo *bo = nvc0->screen->uniform_bo; 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned base = s << 16; 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned size = nvc0->constbuf[s][0].size; 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i == 0); /* we really only want OpenGL uniforms here */ 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(nvc0->constbuf[s][0].u.data); 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->state.uniform_buffer_bound[s] < size) { 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->state.uniform_buffer_bound[s] = align(size, 0x100); 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3); 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, nvc0->state.uniform_buffer_bound[s]); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, bo->offset + base); 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, bo->offset + base); 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(CB_BIND(s)), 1); 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (0 << 4) | 1); 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_cb_push(&nvc0->base, bo, NOUVEAU_BO_VRAM, 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org base, nvc0->state.uniform_buffer_bound[s], 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, (size + 3) / 4, 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->constbuf[s][0].u.data); 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv04_resource *res = 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv04_resource(nvc0->constbuf[s][i].u.buf); 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (res) { 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3); 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, nvc0->constbuf[s][i].size); 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, res->address + nvc0->constbuf[s][i].offset); 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, res->address + nvc0->constbuf[s][i].offset); 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(CB_BIND(s)), 1); 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (i << 4) | 1); 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BCTX_REFN(nvc0->bufctx_3d, CB(s, i), res, RD); 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(CB_BIND(s)), 1); 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (i << 4) | 0); 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 0) 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->state.uniform_buffer_bound[s] = 0; 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_validate_sample_mask(struct nvc0_context *nvc0) 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned mask[4] = 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->sample_mask & 0xffff, 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->sample_mask & 0xffff, 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->sample_mask & 0xffff, 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->sample_mask & 0xffff 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(MSAA_MASK(0)), 4); 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, mask[0]); 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, mask[1]); 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, mask[2]); 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, mask[3]); 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(push, NVC0_3D(SAMPLE_SHADING), 1); 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0x01); 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_validate_derived_1(struct nvc0_context *nvc0) 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nvc0->base.pushbuf; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean rasterizer_discard; 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rasterizer_discard = (!nvc0->fragprog || !nvc0->fragprog->hdr[18]) && 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !nvc0->zsa->pipe.depth.enabled && !nvc0->zsa->pipe.stencil[0].enabled; 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rasterizer_discard = rasterizer_discard || 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->rast->pipe.rasterizer_discard; 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rasterizer_discard != nvc0->state.rasterizer_discard) { 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->state.rasterizer_discard = rasterizer_discard; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(push, NVC0_3D(RASTERIZE_ENABLE), !rasterizer_discard); 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_switch_pipe_context(struct nvc0_context *ctx_to) 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *ctx_from = ctx_to->screen->cur_ctx; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned s; 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx_from) 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_to->state = ctx_from->state; 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_to->dirty = ~0; 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (s = 0; s < 5; ++s) { 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_to->samplers_dirty[s] = ~0; 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_to->textures_dirty[s] = ~0; 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx_to->vertex) 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_to->dirty &= ~(NVC0_NEW_VERTEX | NVC0_NEW_ARRAYS); 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx_to->idxbuf.buffer) 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_to->dirty &= ~NVC0_NEW_IDXBUF; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx_to->vertprog) 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_to->dirty &= ~NVC0_NEW_VERTPROG; 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx_to->fragprog) 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_to->dirty &= ~NVC0_NEW_FRAGPROG; 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx_to->blend) 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_to->dirty &= ~NVC0_NEW_BLEND; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx_to->rast) 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_to->dirty &= ~(NVC0_NEW_RASTERIZER | NVC0_NEW_SCISSOR); 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx_to->zsa) 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_to->dirty &= ~NVC0_NEW_ZSA; 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_to->screen->cur_ctx = ctx_to; 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct state_validate { 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void (*func)(struct nvc0_context *); 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t states; 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} validate_list[] = { 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_validate_fb, NVC0_NEW_FRAMEBUFFER }, 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_validate_blend, NVC0_NEW_BLEND }, 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_validate_zsa, NVC0_NEW_ZSA }, 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_validate_sample_mask, NVC0_NEW_SAMPLE_MASK }, 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_validate_rasterizer, NVC0_NEW_RASTERIZER }, 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_validate_blend_colour, NVC0_NEW_BLEND_COLOUR }, 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_validate_stencil_ref, NVC0_NEW_STENCIL_REF }, 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_validate_stipple, NVC0_NEW_STIPPLE }, 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_validate_scissor, NVC0_NEW_SCISSOR | NVC0_NEW_RASTERIZER }, 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_validate_viewport, NVC0_NEW_VIEWPORT }, 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_vertprog_validate, NVC0_NEW_VERTPROG }, 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_tctlprog_validate, NVC0_NEW_TCTLPROG }, 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_tevlprog_validate, NVC0_NEW_TEVLPROG }, 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_gmtyprog_validate, NVC0_NEW_GMTYPROG }, 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_fragprog_validate, NVC0_NEW_FRAGPROG }, 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_validate_derived_1, NVC0_NEW_FRAGPROG | NVC0_NEW_ZSA | 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_NEW_RASTERIZER }, 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_validate_clip, NVC0_NEW_CLIP | NVC0_NEW_RASTERIZER | 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_NEW_VERTPROG | 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_NEW_TEVLPROG | 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_NEW_GMTYPROG }, 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_constbufs_validate, NVC0_NEW_CONSTBUF }, 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_validate_textures, NVC0_NEW_TEXTURES }, 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_validate_samplers, NVC0_NEW_SAMPLERS }, 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nve4_set_tex_handles, NVC0_NEW_TEXTURES | NVC0_NEW_SAMPLERS }, 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_vertex_arrays_validate, NVC0_NEW_VERTEX | NVC0_NEW_ARRAYS }, 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_idxbuf_validate, NVC0_NEW_IDXBUF }, 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { nvc0_tfb_validate, NVC0_NEW_TFB_TARGETS | NVC0_NEW_GMTYPROG } 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define validate_list_len (sizeof(validate_list) / sizeof(validate_list[0])) 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_state_validate(struct nvc0_context *nvc0, uint32_t mask, unsigned words) 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t state_mask; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ret; 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->screen->cur_ctx != nvc0) 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_switch_pipe_context(nvc0); 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state_mask = nvc0->dirty & mask; 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state_mask) { 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < validate_list_len; ++i) { 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct state_validate *validate = &validate_list[i]; 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state_mask & validate->states) 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org validate->func(nvc0); 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty &= ~state_mask; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_bufctx_fence(nvc0, nvc0->bufctx_3d, FALSE); 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_pushbuf_bufctx(nvc0->base.pushbuf, nvc0->bufctx_3d); 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_pushbuf_validate(nvc0->base.pushbuf); 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(ret)) 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(nvc0->state.flushed)) 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_bufctx_fence(nvc0, nvc0->bufctx_3d, TRUE); 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 553