mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 22:10:10 +01:00
nv50: fix code uploads bigger than 0x10000 bytes
The hardware has a max limit on how much data we can upload in one go via the 2D engine. Just split the uploads up. Cc: mesa-stable Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/9571 Acked-by: M Henning <drawoc@darkrefraction.com> Signed-off-by: Karol Herbst <git@karolherbst.de> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24706>
This commit is contained in:
parent
8e13736222
commit
7f63d2ebdb
1 changed files with 42 additions and 33 deletions
|
|
@ -279,47 +279,56 @@ nv50_sifc_linear_u8(struct nouveau_context *nv,
|
||||||
struct nv50_context *nv50 = nv50_context(&nv->pipe);
|
struct nv50_context *nv50 = nv50_context(&nv->pipe);
|
||||||
struct nouveau_pushbuf *push = nv50->base.pushbuf;
|
struct nouveau_pushbuf *push = nv50->base.pushbuf;
|
||||||
uint32_t *src = (uint32_t *)data;
|
uint32_t *src = (uint32_t *)data;
|
||||||
unsigned count = (size + 3) / 4;
|
unsigned count = DIV_ROUND_UP(size, 4);
|
||||||
unsigned xcoord = offset & 0xff;
|
unsigned max_size = 0x10000;
|
||||||
|
|
||||||
nouveau_bufctx_refn(nv50->bufctx, 0, dst, domain | NOUVEAU_BO_WR);
|
nouveau_bufctx_refn(nv50->bufctx, 0, dst, domain | NOUVEAU_BO_WR);
|
||||||
nouveau_pushbuf_bufctx(push, nv50->bufctx);
|
nouveau_pushbuf_bufctx(push, nv50->bufctx);
|
||||||
|
|
||||||
PUSH_VAL(push);
|
PUSH_VAL(push);
|
||||||
|
|
||||||
offset &= ~0xff;
|
|
||||||
|
|
||||||
BEGIN_NV04(push, NV50_2D(DST_FORMAT), 2);
|
|
||||||
PUSH_DATA (push, G80_SURFACE_FORMAT_R8_UNORM);
|
|
||||||
PUSH_DATA (push, 1);
|
|
||||||
BEGIN_NV04(push, NV50_2D(DST_PITCH), 5);
|
|
||||||
PUSH_DATA (push, 262144);
|
|
||||||
PUSH_DATA (push, 65536);
|
|
||||||
PUSH_DATA (push, 1);
|
|
||||||
PUSH_DATAh(push, dst->offset + offset);
|
|
||||||
PUSH_DATA (push, dst->offset + offset);
|
|
||||||
BEGIN_NV04(push, NV50_2D(SIFC_BITMAP_ENABLE), 2);
|
|
||||||
PUSH_DATA (push, 0);
|
|
||||||
PUSH_DATA (push, G80_SURFACE_FORMAT_R8_UNORM);
|
|
||||||
BEGIN_NV04(push, NV50_2D(SIFC_WIDTH), 10);
|
|
||||||
PUSH_DATA (push, size);
|
|
||||||
PUSH_DATA (push, 1);
|
|
||||||
PUSH_DATA (push, 0);
|
|
||||||
PUSH_DATA (push, 1);
|
|
||||||
PUSH_DATA (push, 0);
|
|
||||||
PUSH_DATA (push, 1);
|
|
||||||
PUSH_DATA (push, 0);
|
|
||||||
PUSH_DATA (push, xcoord);
|
|
||||||
PUSH_DATA (push, 0);
|
|
||||||
PUSH_DATA (push, 0);
|
|
||||||
|
|
||||||
while (count) {
|
while (count) {
|
||||||
unsigned nr = MIN2(count, NV04_PFIFO_MAX_PACKET_LEN);
|
unsigned xcoord = offset & 0xff;
|
||||||
|
offset &= ~0xff;
|
||||||
|
|
||||||
BEGIN_NI04(push, NV50_2D(SIFC_DATA), nr);
|
BEGIN_NV04(push, NV50_2D(DST_FORMAT), 2);
|
||||||
PUSH_DATAp(push, src, nr);
|
PUSH_DATA (push, G80_SURFACE_FORMAT_R8_UNORM);
|
||||||
|
PUSH_DATA (push, 1);
|
||||||
|
BEGIN_NV04(push, NV50_2D(DST_PITCH), 5);
|
||||||
|
PUSH_DATA (push, 262144);
|
||||||
|
PUSH_DATA (push, 65536);
|
||||||
|
PUSH_DATA (push, 1);
|
||||||
|
PUSH_DATAh(push, dst->offset + offset);
|
||||||
|
PUSH_DATA (push, dst->offset + offset);
|
||||||
|
BEGIN_NV04(push, NV50_2D(SIFC_BITMAP_ENABLE), 2);
|
||||||
|
PUSH_DATA (push, 0);
|
||||||
|
PUSH_DATA (push, G80_SURFACE_FORMAT_R8_UNORM);
|
||||||
|
BEGIN_NV04(push, NV50_2D(SIFC_WIDTH), 10);
|
||||||
|
PUSH_DATA (push, MIN2(size, max_size));
|
||||||
|
PUSH_DATA (push, 1);
|
||||||
|
PUSH_DATA (push, 0);
|
||||||
|
PUSH_DATA (push, 1);
|
||||||
|
PUSH_DATA (push, 0);
|
||||||
|
PUSH_DATA (push, 1);
|
||||||
|
PUSH_DATA (push, 0);
|
||||||
|
PUSH_DATA (push, xcoord);
|
||||||
|
PUSH_DATA (push, 0);
|
||||||
|
PUSH_DATA (push, 0);
|
||||||
|
|
||||||
src += nr;
|
unsigned iter_count = MIN2(count, max_size / 4);
|
||||||
count -= nr;
|
count -= iter_count;
|
||||||
|
offset += max_size;
|
||||||
|
size -= max_size;
|
||||||
|
|
||||||
|
while (iter_count) {
|
||||||
|
unsigned nr = MIN2(iter_count, NV04_PFIFO_MAX_PACKET_LEN);
|
||||||
|
|
||||||
|
BEGIN_NI04(push, NV50_2D(SIFC_DATA), nr);
|
||||||
|
PUSH_DATAp(push, src, nr);
|
||||||
|
|
||||||
|
src += nr;
|
||||||
|
iter_count -= nr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nouveau_bufctx_reset(nv50->bufctx, 0);
|
nouveau_bufctx_reset(nv50->bufctx, 0);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue