1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h" 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_context.h" 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_defs.xml.h" 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct nv50_transfer { 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer base; 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_m2mf_rect rect[2]; 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t nblocksx; 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t nblocksy; 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_m2mf_rect_setup(struct nv50_m2mf_rect *rect, 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *restrict res, unsigned l, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x, unsigned y, unsigned z) 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_miptree *mt = nv50_miptree(res); 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned w = u_minify(res->width0, l); 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned h = u_minify(res->height0, l); 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect->bo = mt->base.bo; 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect->domain = mt->base.domain; 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect->base = mt->level[l].offset; 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect->pitch = mt->level[l].pitch; 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (util_format_is_plain(res->format)) { 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect->width = w << mt->ms_x; 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect->height = h << mt->ms_y; 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect->x = x << mt->ms_x; 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect->y = y << mt->ms_y; 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect->width = util_format_get_nblocksx(res->format, w); 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect->height = util_format_get_nblocksy(res->format, h); 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect->x = util_format_get_nblocksx(res->format, x); 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect->y = util_format_get_nblocksy(res->format, y); 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect->tile_mode = mt->level[l].tile_mode; 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect->cpp = util_format_get_blocksize(res->format); 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mt->layout_3d) { 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect->z = z; 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect->depth = u_minify(res->depth0, l); 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect->base += z * mt->layer_stride; 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect->z = 0; 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rect->depth = 1; 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_m2mf_transfer_rect(struct nv50_context *nv50, 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct nv50_m2mf_rect *dst, 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct nv50_m2mf_rect *src, 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t nblocksx, uint32_t nblocksy) 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nv50->base.pushbuf; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_bufctx *bctx = nv50->bufctx; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int cpp = dst->cpp; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t src_ofst = src->base; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t dst_ofst = dst->base; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t height = nblocksy; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t sy = src->y; 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t dy = dst->y; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dst->cpp == src->cpp); 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_refn(bctx, 0, src->bo, src->domain | NOUVEAU_BO_RD); 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_refn(bctx, 0, dst->bo, dst->domain | NOUVEAU_BO_WR); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_pushbuf_bufctx(push, bctx); 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_pushbuf_validate(push); 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nouveau_bo_memtype(src->bo)) { 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_M2MF(LINEAR_IN), 6); 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, src->tile_mode); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, src->width * cpp); 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, src->height); 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, src->depth); 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, src->z); 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_ofst += src->y * src->pitch + src->x * cpp; 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_M2MF(LINEAR_IN), 1); 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, SUBC_M2MF(NV03_M2MF_PITCH_IN), 1); 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, src->pitch); 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nouveau_bo_memtype(dst->bo)) { 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_M2MF(LINEAR_OUT), 6); 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, dst->tile_mode); 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, dst->width * cpp); 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, dst->height); 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, dst->depth); 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, dst->z); 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_ofst += dst->y * dst->pitch + dst->x * cpp; 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_M2MF(LINEAR_OUT), 1); 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, SUBC_M2MF(NV03_M2MF_PITCH_OUT), 1); 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, dst->pitch); 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (height) { 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int line_count = height > 2047 ? 2047 : height; 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_M2MF(OFFSET_IN_HIGH), 2); 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, src->bo->offset + src_ofst); 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, dst->bo->offset + dst_ofst); 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, SUBC_M2MF(NV03_M2MF_OFFSET_IN), 2); 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, src->bo->offset + src_ofst); 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, dst->bo->offset + dst_ofst); 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nouveau_bo_memtype(src->bo)) { 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_M2MF(TILING_POSITION_IN), 1); 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (sy << 16) | (src->x * cpp)); 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_ofst += line_count * src->pitch; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nouveau_bo_memtype(dst->bo)) { 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_M2MF(TILING_POSITION_OUT), 1); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (dy << 16) | (dst->x * cpp)); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_ofst += line_count * dst->pitch; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, SUBC_M2MF(NV03_M2MF_LINE_LENGTH_IN), 4); 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, nblocksx * cpp); 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, line_count); 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (1 << 8) | (1 << 0)); 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org height -= line_count; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sy += line_count; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dy += line_count; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_reset(bctx, 0); 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_sifc_linear_u8(struct nouveau_context *nv, 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_bo *dst, unsigned offset, unsigned domain, 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, const void *data) 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_context *nv50 = nv50_context(&nv->pipe); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nv50->base.pushbuf; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *src = (uint32_t *)data; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count = (size + 3) / 4; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned xcoord = offset & 0xff; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_refn(nv50->bufctx, 0, dst, domain | NOUVEAU_BO_WR); 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_pushbuf_bufctx(push, nv50->bufctx); 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_pushbuf_validate(push); 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset &= ~0xff; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_2D(DST_FORMAT), 2); 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV50_SURFACE_FORMAT_R8_UNORM); 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_2D(DST_PITCH), 5); 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 262144); 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 65536); 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, dst->offset + offset); 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, dst->offset + offset); 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_2D(SIFC_BITMAP_ENABLE), 2); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV50_SURFACE_FORMAT_R8_UNORM); 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_2D(SIFC_WIDTH), 10); 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, size); 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, xcoord); 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (count) { 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!PUSH_SPACE(push, 16)) 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = PUSH_AVAIL(push); 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(nr >= 16); 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2(count, nr - 1); 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2(nr, NV04_PFIFO_MAX_PACKET_LEN); 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NI04(push, NV50_2D(SIFC_DATA), nr); 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAp(push, src, nr); 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += nr; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= nr; 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_reset(nv50->bufctx, 0); 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_m2mf_copy_linear(struct nouveau_context *nv, 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_bo *dst, unsigned dstoff, unsigned dstdom, 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_bo *src, unsigned srcoff, unsigned srcdom, 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size) 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nv->pushbuf; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_bufctx *bctx = nv50_context(&nv->pipe)->bufctx; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_refn(bctx, 0, src, srcdom | NOUVEAU_BO_RD); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_refn(bctx, 0, dst, dstdom | NOUVEAU_BO_WR); 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_pushbuf_bufctx(push, bctx); 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_pushbuf_validate(push); 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_M2MF(LINEAR_IN), 1); 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_M2MF(LINEAR_OUT), 1); 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (size) { 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned bytes = MIN2(size, 1 << 17); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_M2MF(OFFSET_IN_HIGH), 2); 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, src->offset + srcoff); 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, dst->offset + dstoff); 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, SUBC_M2MF(NV03_M2MF_OFFSET_IN), 2); 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, src->offset + srcoff); 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, dst->offset + dstoff); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, SUBC_M2MF(NV03_M2MF_LINE_LENGTH_IN), 4); 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, bytes); 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (1 << 8) | (1 << 0)); 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcoff += bytes; 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstoff += bytes; 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size -= bytes; 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_reset(bctx, 0); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_transfer * 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_miptree_transfer_new(struct pipe_context *pctx, 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *res, 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned level, 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned usage, 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_box *box) 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_context *nv50 = nv50_context(pctx); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_device *dev = nv50->screen->base.device; 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct nv50_miptree *mt = nv50_miptree(res); 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_transfer *tx; 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t size; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ret; 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (usage & PIPE_TRANSFER_MAP_DIRECTLY) 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx = CALLOC_STRUCT(nv50_transfer); 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tx) 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&tx->base.resource, res); 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->base.level = level; 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->base.usage = usage; 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->base.box = *box; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (util_format_is_plain(res->format)) { 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->nblocksx = box->width << mt->ms_x; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->nblocksy = box->height << mt->ms_x; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->nblocksx = util_format_get_nblocksx(res->format, box->width); 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->nblocksy = util_format_get_nblocksy(res->format, box->height); 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->base.stride = tx->nblocksx * util_format_get_blocksize(res->format); 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->base.layer_stride = tx->nblocksy * tx->base.stride; 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_m2mf_rect_setup(&tx->rect[0], res, level, box->x, box->y, box->z); 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = tx->base.layer_stride; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_bo_new(dev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP, 0, 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size * tx->base.box.depth, NULL, &tx->rect[1].bo); 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) { 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(tx); 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->rect[1].cpp = tx->rect[0].cpp; 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->rect[1].width = tx->nblocksx; 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->rect[1].height = tx->nblocksy; 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->rect[1].depth = 1; 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->rect[1].pitch = tx->base.stride; 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->rect[1].domain = NOUVEAU_BO_GART; 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (usage & PIPE_TRANSFER_READ) { 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned base = tx->rect[0].base; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned z = tx->rect[0].z; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < box->depth; ++i) { 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_m2mf_transfer_rect(nv50, &tx->rect[1], &tx->rect[0], 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->nblocksx, tx->nblocksy); 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mt->layout_3d) 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->rect[0].z++; 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->rect[0].base += mt->layer_stride; 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->rect[1].base += size; 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->rect[0].z = z; 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->rect[0].base = base; 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->rect[1].base = 0; 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &tx->base; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_miptree_transfer_del(struct pipe_context *pctx, 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *transfer) 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_context *nv50 = nv50_context(pctx); 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_transfer *tx = (struct nv50_transfer *)transfer; 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_miptree *mt = nv50_miptree(tx->base.resource); 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tx->base.usage & PIPE_TRANSFER_WRITE) { 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < tx->base.box.depth; ++i) { 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_m2mf_transfer_rect(nv50, &tx->rect[0], &tx->rect[1], 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->nblocksx, tx->nblocksy); 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mt->layout_3d) 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->rect[0].z++; 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->rect[0].base += mt->layer_stride; 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tx->rect[1].base += tx->nblocksy * tx->base.stride; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bo_ref(NULL, &tx->rect[1].bo); 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&transfer->resource, NULL); 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(tx); 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid * 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_miptree_transfer_map(struct pipe_context *pctx, 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *transfer) 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_screen *screen = nv50_screen(pctx->screen); 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_transfer *tx = (struct nv50_transfer *)transfer; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ret; 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned flags = 0; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tx->rect[1].bo->map) 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tx->rect[1].bo->map; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (transfer->usage & PIPE_TRANSFER_READ) 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags = NOUVEAU_BO_RD; 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (transfer->usage & PIPE_TRANSFER_WRITE) 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags |= NOUVEAU_BO_WR; 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = nouveau_bo_map(tx->rect[1].bo, flags, screen->base.client); 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tx->rect[1].bo->map; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_miptree_transfer_unmap(struct pipe_context *pctx, 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *transfer) 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* nothing to do */ 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_cb_push(struct nouveau_context *nv, 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_bo *bo, unsigned domain, 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned base, unsigned size, 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned offset, unsigned words, const uint32_t *data) 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nv->pushbuf; 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_bufctx *bctx = nv50_context(&nv->pipe)->bufctx; 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(offset & 3)); 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = align(size, 0x100); 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_refn(bctx, 0, bo, NOUVEAU_BO_WR | domain); 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_pushbuf_bufctx(push, bctx); 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_pushbuf_validate(push); 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (words) { 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr; 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = PUSH_AVAIL(push); 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2(nr - 7, words); 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = MIN2(nr, NV04_PFIFO_MAX_PACKET_LEN - 1); 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(CB_DEF_ADDRESS_HIGH), 3); 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, bo->offset + base); 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, bo->offset + base); 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (NV50_CB_TMP << 16) | (size & 0xffff)); 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(CB_ADDR), 1); 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (offset << 6) | NV50_CB_TMP); 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NI04(push, NV50_3D(CB_DATA(0)), nr); 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAp(push, data, nr); 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org words -= nr; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data += nr; 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset += nr * 4; 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_reset(bctx, 0); 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 422