diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/i965_render.c | 126 |
1 files changed, 60 insertions, 66 deletions
diff --git a/src/i965_render.c b/src/i965_render.c index 00cb0514..281eb0da 100644 --- a/src/i965_render.c +++ b/src/i965_render.c @@ -501,6 +501,7 @@ typedef struct gen4_composite_op { PixmapPtr source; PixmapPtr mask; PixmapPtr dest; + drm_intel_bo *binding_table_bo; } gen4_composite_op; /** Private data for gen4 render accel implementation. */ @@ -992,9 +993,8 @@ _emit_batch_header_for_composite_internal (ScrnInfoPtr pScrn, Bool check_twice) char *state_base; int state_base_offset; uint32_t src_blend, dst_blend; - uint32_t *binding_table; dri_bo *bo_table[NUM_BO]; - dri_bo *binding_table_bo, *surface_state_bo; + dri_bo *binding_table_bo = composite_op->binding_table_bo; if (render_state->vertex_buffer_bo == NULL) { render_state->vertex_buffer_bo = dri_bo_alloc (pI830->bufmgr, "vb", @@ -1061,67 +1061,6 @@ _emit_batch_header_for_composite_internal (ScrnInfoPtr pScrn, Bool check_twice) i965_get_blend_cntl(op, pMaskPicture, pDstPicture->format, &src_blend, &dst_blend); - /* Set up the surface states. */ - surface_state_bo = dri_bo_alloc (pI830->bufmgr, "surface_state", - 3 * sizeof (brw_surface_state_padded), - 4096); - if (dri_bo_map (surface_state_bo, 1) != 0) { - dri_bo_unreference (surface_state_bo); - dri_bo_unreference (render_state->vertex_buffer_bo); - render_state->vertex_buffer_bo = NULL; - - return FALSE; - } - /* Set up the state buffer for the destination surface */ - i965_set_picture_surface_state(surface_state_bo, 0, - pDstPicture, pDst, TRUE); - /* Set up the source surface state buffer */ - i965_set_picture_surface_state(surface_state_bo, 1, - pSrcPicture, pSrc, FALSE); - if (pMask) { - /* Set up the mask surface state buffer */ - i965_set_picture_surface_state(surface_state_bo, 2, - pMaskPicture, pMask, - FALSE); - } - dri_bo_unmap (surface_state_bo); - - /* Set up the binding table of surface indices to surface state. */ - binding_table_bo = dri_bo_alloc (pI830->bufmgr, "binding_table", - 3 * sizeof (uint32_t), 4096); - if (dri_bo_map (binding_table_bo, 1) != 0) { - dri_bo_unreference(binding_table_bo); - dri_bo_unreference(surface_state_bo); - dri_bo_unreference (render_state->vertex_buffer_bo); - render_state->vertex_buffer_bo = NULL; - - return FALSE; - } - - binding_table = binding_table_bo->virtual; - binding_table[0] = 0 * sizeof (brw_surface_state_padded) + surface_state_bo->offset; - dri_bo_emit_reloc (binding_table_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, - 0 * sizeof (brw_surface_state_padded), - 0 * sizeof (uint32_t), - surface_state_bo); - - binding_table[1] = 1 * sizeof (brw_surface_state_padded) + surface_state_bo->offset; - dri_bo_emit_reloc (binding_table_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, - 1 * sizeof (brw_surface_state_padded), - 1 * sizeof (uint32_t), - surface_state_bo); - - if (pMask) { - binding_table[2] = 2 * sizeof (brw_surface_state_padded) + surface_state_bo->offset; - dri_bo_emit_reloc (binding_table_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, - 2 * sizeof (brw_surface_state_padded), - 2 * sizeof (uint32_t), - surface_state_bo); - } else { - binding_table[2] = 0; - } - dri_bo_unmap (binding_table_bo); - src_filter = sampler_state_filter_from_picture (pSrcPicture->filter); if (src_filter < 0) I830FALLBACK ("Bad src filter 0x%x\n", pSrcPicture->filter); @@ -1376,9 +1315,6 @@ _emit_batch_header_for_composite_internal (ScrnInfoPtr pScrn, Bool check_twice) I830Sync(pScrn); #endif - dri_bo_unreference (binding_table_bo); - dri_bo_unreference (surface_state_bo); - return TRUE; } #undef NUM_BO @@ -1392,6 +1328,62 @@ i965_prepare_composite(int op, PicturePtr pSrcPicture, I830Ptr pI830 = I830PTR(pScrn); struct gen4_render_state *render_state= pI830->gen4_render_state; gen4_composite_op *composite_op = &render_state->composite_op; + uint32_t *binding_table; + drm_intel_bo *binding_table_bo, *surface_state_bo; + + /* Set up the surface states. */ + surface_state_bo = dri_bo_alloc(pI830->bufmgr, "surface_state", + 3 * sizeof (brw_surface_state_padded), + 4096); + if (dri_bo_map(surface_state_bo, 1) != 0) + return FALSE; + /* Set up the state buffer for the destination surface */ + i965_set_picture_surface_state(surface_state_bo, 0, + pDstPicture, pDst, TRUE); + /* Set up the source surface state buffer */ + i965_set_picture_surface_state(surface_state_bo, 1, + pSrcPicture, pSrc, FALSE); + if (pMask) { + /* Set up the mask surface state buffer */ + i965_set_picture_surface_state(surface_state_bo, 2, + pMaskPicture, pMask, + FALSE); + } + dri_bo_unmap(surface_state_bo); + + /* Set up the binding table of surface indices to surface state. */ + binding_table_bo = dri_bo_alloc(pI830->bufmgr, "binding_table", + 3 * sizeof(uint32_t), 4096); + if (dri_bo_map (binding_table_bo, 1) != 0) { + dri_bo_unreference(surface_state_bo); + return FALSE; + } + + binding_table = binding_table_bo->virtual; + binding_table[0] = 0 * sizeof (brw_surface_state_padded) + surface_state_bo->offset; + dri_bo_emit_reloc (binding_table_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, + 0 * sizeof (brw_surface_state_padded), + 0 * sizeof (uint32_t), + surface_state_bo); + + binding_table[1] = 1 * sizeof (brw_surface_state_padded) + surface_state_bo->offset; + dri_bo_emit_reloc (binding_table_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, + 1 * sizeof (brw_surface_state_padded), + 1 * sizeof (uint32_t), + surface_state_bo); + + if (pMask) { + binding_table[2] = 2 * sizeof (brw_surface_state_padded) + surface_state_bo->offset; + dri_bo_emit_reloc (binding_table_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, + 2 * sizeof (brw_surface_state_padded), + 2 * sizeof (uint32_t), + surface_state_bo); + } else { + binding_table[2] = 0; + } + dri_bo_unmap(binding_table_bo); + /* All refs to surface_state are now contained in binding_table_bo. */ + drm_intel_bo_unreference(surface_state_bo); composite_op->op = op; composite_op->source_picture = pSrcPicture; @@ -1400,6 +1392,8 @@ i965_prepare_composite(int op, PicturePtr pSrcPicture, composite_op->source = pSrc; composite_op->mask = pMask; composite_op->dest = pDst; + drm_intel_bo_unreference(composite_op->binding_table_bo); + composite_op->binding_table_bo = binding_table_bo; /* Fallback if we can't make this operation fit. */ return _emit_batch_header_for_composite_check_twice (pScrn); |