From 4467c0c9fbf2c13b6c73a002e8247448ee12d4c4 Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Sat, 3 May 2014 03:00:07 -0400 Subject: [PATCH] nv50,nvc0: leave queries on during blit, turn them on for 2d engine Fixes the new logic of the conditional rendering piglit test. Signed-off-by: Ilia Mirkin Reviewed-by: Ben Skeggs Cc: "10.2" --- src/gallium/drivers/nouveau/nv50/nv50_query.c | 6 +++++- src/gallium/drivers/nouveau/nv50/nv50_screen.c | 2 ++ src/gallium/drivers/nouveau/nv50/nv50_surface.c | 15 +++++++++++++-- src/gallium/drivers/nouveau/nvc0/nvc0_query.c | 5 ++++- src/gallium/drivers/nouveau/nvc0/nvc0_screen.c | 2 ++ src/gallium/drivers/nouveau/nvc0/nvc0_surface.c | 11 +++++++++-- 6 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/nouveau/nv50/nv50_query.c b/src/gallium/drivers/nouveau/nv50/nv50_query.c index 6f25a08..6a17139 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_query.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_query.c @@ -332,7 +332,7 @@ nv50_render_condition(struct pipe_context *pipe, nv50->cond_cond = condition; nv50->cond_mode = mode; - PUSH_SPACE(push, 6); + PUSH_SPACE(push, 9); if (!pq) { BEGIN_NV04(push, NV50_3D(COND_MODE), 1); @@ -351,6 +351,10 @@ nv50_render_condition(struct pipe_context *pipe, PUSH_DATAh(push, q->bo->offset + q->offset); PUSH_DATA (push, q->bo->offset + q->offset); PUSH_DATA (push, NV50_3D_COND_MODE_RES_NON_ZERO); + + BEGIN_NV04(push, NV50_2D(COND_ADDRESS_HIGH), 2); + PUSH_DATAh(push, q->bo->offset + q->offset); + PUSH_DATA (push, q->bo->offset + q->offset); } void diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c index fcac3c1..68d30ea 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c @@ -398,6 +398,8 @@ nv50_screen_init_hwctx(struct nv50_screen *screen) PUSH_DATA (push, 0); BEGIN_NV04(push, SUBC_2D(0x0888), 1); PUSH_DATA (push, 1); + BEGIN_NV04(push, NV50_2D(COND_MODE), 1); + PUSH_DATA (push, NV50_2D_COND_MODE_ALWAYS); BEGIN_NV04(push, SUBC_3D(NV01_SUBCHAN_OBJECT), 1); PUSH_DATA (push, screen->tesla->handle); diff --git a/src/gallium/drivers/nouveau/nv50/nv50_surface.c b/src/gallium/drivers/nouveau/nv50/nv50_surface.c index 6b4dc4d..df3bc86 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_surface.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_surface.c @@ -611,6 +611,7 @@ struct nv50_blitctx uint8_t mode; uint16_t color_mask; uint8_t filter; + uint8_t render_condition_enable; enum pipe_texture_target target; struct { struct pipe_framebuffer_state fb; @@ -933,7 +934,7 @@ nv50_blitctx_prepare_state(struct nv50_blitctx *blit) { struct nouveau_pushbuf *push = blit->nv50->base.pushbuf; - if (blit->nv50->cond_query) { + if (blit->nv50->cond_query && !blit->render_condition_enable) { BEGIN_NV04(push, NV50_3D(COND_MODE), 1); PUSH_DATA (push, NV50_3D_COND_MODE_ALWAYS); } @@ -1071,7 +1072,7 @@ nv50_blitctx_post_blit(struct nv50_blitctx *blit) nv50->samplers[2][0] = blit->saved.sampler[0]; nv50->samplers[2][1] = blit->saved.sampler[1]; - if (nv50->cond_query) + if (nv50->cond_query && !blit->render_condition_enable) nv50->base.pipe.render_condition(&nv50->base.pipe, nv50->cond_query, nv50->cond_cond, nv50->cond_mode); @@ -1105,6 +1106,7 @@ nv50_blit_3d(struct nv50_context *nv50, const struct pipe_blit_info *info) blit->mode = nv50_blit_select_mode(info); blit->color_mask = nv50_blit_derive_color_mask(info); blit->filter = nv50_blit_get_filter(info); + blit->render_condition_enable = info->render_condition_enable; nv50_blit_select_fp(blit, info); nv50_blitctx_pre_blit(blit); @@ -1262,6 +1264,11 @@ nv50_blit_eng2d(struct nv50_context *nv50, const struct pipe_blit_info *info) PUSH_DATA (push, 1); /* enable */ } + if (nv50->cond_query && info->render_condition_enable) { + BEGIN_NV04(push, NV50_2D(COND_MODE), 1); + PUSH_DATA (push, NV50_2D_COND_MODE_RES_NON_ZERO); + } + if (mask != 0xffffffff) { BEGIN_NV04(push, NV50_2D(ROP), 1); PUSH_DATA (push, 0xca); /* DPSDxax */ @@ -1384,6 +1391,10 @@ nv50_blit_eng2d(struct nv50_context *nv50, const struct pipe_blit_info *info) BEGIN_NV04(push, NV50_2D(OPERATION), 1); PUSH_DATA (push, NV50_2D_OPERATION_SRCCOPY); } + if (nv50->cond_query && info->render_condition_enable) { + BEGIN_NV04(push, NV50_2D(COND_MODE), 1); + PUSH_DATA (push, NV50_2D_COND_MODE_ALWAYS); + } } static void diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_query.c b/src/gallium/drivers/nouveau/nvc0/nvc0_query.c index 21aa358..856f685 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_query.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_query.c @@ -585,12 +585,15 @@ nvc0_render_condition(struct pipe_context *pipe, if (wait) nvc0_query_fifo_wait(push, pq); - PUSH_SPACE(push, 4); + PUSH_SPACE(push, 7); PUSH_REFN (push, q->bo, NOUVEAU_BO_GART | NOUVEAU_BO_RD); BEGIN_NVC0(push, NVC0_3D(COND_ADDRESS_HIGH), 3); PUSH_DATAh(push, q->bo->offset + q->offset); PUSH_DATA (push, q->bo->offset + q->offset); PUSH_DATA (push, cond); + BEGIN_NVC0(push, NVC0_2D(COND_ADDRESS_HIGH), 2); + PUSH_DATAh(push, q->bo->offset + q->offset); + PUSH_DATA (push, q->bo->offset + q->offset); } void diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c index 2166788..1da991c 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c @@ -677,6 +677,8 @@ nvc0_screen_create(struct nouveau_device *dev) PUSH_DATA (push, 0x3f); BEGIN_NVC0(push, SUBC_2D(0x0888), 1); PUSH_DATA (push, 1); + BEGIN_NVC0(push, NVC0_2D(COND_MODE), 1); + PUSH_DATA (push, NVC0_2D_COND_MODE_ALWAYS); BEGIN_NVC0(push, SUBC_2D(NVC0_GRAPH_NOTIFY_ADDRESS_HIGH), 2); PUSH_DATAh(push, screen->fence.bo->offset + 16); diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c index 4a550b0..acadb2c 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c @@ -503,6 +503,7 @@ struct nvc0_blitctx uint8_t mode; uint16_t color_mask; uint8_t filter; + uint8_t render_condition_enable; enum pipe_texture_target target; struct { struct pipe_framebuffer_state fb; @@ -691,7 +692,7 @@ nvc0_blitctx_prepare_state(struct nvc0_blitctx *blit) /* TODO: maybe make this a MACRO (if we need more logic) ? */ - if (blit->nvc0->cond_query) + if (blit->nvc0->cond_query && !blit->render_condition_enable) IMMED_NVC0(push, NVC0_3D(COND_MODE), NVC0_3D_COND_MODE_ALWAYS); /* blend state */ @@ -833,7 +834,7 @@ nvc0_blitctx_post_blit(struct nvc0_blitctx *blit) nvc0->textures_dirty[4] |= 3; nvc0->samplers_dirty[4] |= 3; - if (nvc0->cond_query) + if (nvc0->cond_query && !blit->render_condition_enable) nvc0->base.pipe.render_condition(&nvc0->base.pipe, nvc0->cond_query, nvc0->cond_cond, nvc0->cond_mode); @@ -868,6 +869,7 @@ nvc0_blit_3d(struct nvc0_context *nvc0, const struct pipe_blit_info *info) blit->mode = nv50_blit_select_mode(info); blit->color_mask = nv50_blit_derive_color_mask(info); blit->filter = nv50_blit_get_filter(info); + blit->render_condition_enable = info->render_condition_enable; nvc0_blit_select_fp(blit, info); nvc0_blitctx_pre_blit(blit); @@ -1030,6 +1032,9 @@ nvc0_blit_eng2d(struct nvc0_context *nvc0, const struct pipe_blit_info *info) PUSH_DATA (push, 1); /* enable */ } + if (nvc0->cond_query && info->render_condition_enable) + IMMED_NVC0(push, NVC0_2D(COND_MODE), NVC0_2D_COND_MODE_RES_NON_ZERO); + if (mask != 0xffffffff) { IMMED_NVC0(push, NVC0_2D(ROP), 0xca); /* DPSDxax */ IMMED_NVC0(push, NVC0_2D(PATTERN_COLOR_FORMAT), @@ -1154,6 +1159,8 @@ nvc0_blit_eng2d(struct nvc0_context *nvc0, const struct pipe_blit_info *info) IMMED_NVC0(push, NVC0_2D(CLIP_ENABLE), 0); if (mask != 0xffffffff) IMMED_NVC0(push, NVC0_2D(OPERATION), NVC0_2D_OPERATION_SRCCOPY); + if (nvc0->cond_query && info->render_condition_enable) + IMMED_NVC0(push, NVC0_2D(COND_MODE), NVC0_2D_COND_MODE_ALWAYS); } static void -- 2.7.4