diff options
author | Eric Anholt <eric@anholt.net> | 2008-12-04 15:02:12 -0800 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2008-12-04 17:48:45 -0800 |
commit | ae2cd8b75e41393e072e27064ecefecf1aa1bc6c (patch) | |
tree | 33e90aa90f9844d59e949604deec7d5fb2c32d3f /src/i965_video.c | |
parent | 1b3c3c9d79305abe1785fdaef26a950dafa8890f (diff) |
Move i965 video surface state and binding table to BOs.
Diffstat (limited to 'src/i965_video.c')
-rw-r--r-- | src/i965_video.c | 137 |
1 files changed, 73 insertions, 64 deletions
diff --git a/src/i965_video.c b/src/i965_video.c index 3bc2f6ea..68a12ec8 100644 --- a/src/i965_video.c +++ b/src/i965_video.c @@ -343,12 +343,19 @@ intel_emit_reloc(drm_intel_bo *bo, uint32_t offset, return target_bo->offset + target_offset; } -static void -i965_set_dst_surface_state(ScrnInfoPtr scrn, - struct brw_surface_state *dest_surf_state, - PixmapPtr pixmap) +static drm_intel_bo * +i965_create_dst_surface_state(ScrnInfoPtr scrn, + PixmapPtr pixmap) { I830Ptr pI830 = I830PTR(scrn); + struct brw_surface_state *dest_surf_state; + drm_intel_bo *surf_bo; + + surf_bo = drm_intel_bo_alloc(pI830->bufmgr, + "textured video surface state", + 4096, 4096); + drm_intel_bo_map(surf_bo, TRUE); + dest_surf_state = surf_bo->virtual; memset(dest_surf_state, 0, sizeof(*dest_surf_state)); dest_surf_state->ss0.surface_type = BRW_SURFACE_2D; @@ -376,17 +383,29 @@ i965_set_dst_surface_state(ScrnInfoPtr scrn, dest_surf_state->ss3.pitch = intel_get_pixmap_pitch(pixmap) - 1; dest_surf_state->ss3.tiled_surface = i830_pixmap_tiled(pixmap); dest_surf_state->ss3.tile_walk = 0; /* TileX */ + + drm_intel_bo_unmap(surf_bo); + return surf_bo; } -static void -i965_set_src_surface_state(ScrnInfoPtr scrn, - struct brw_surface_state *src_surf_state, +static drm_intel_bo * +i965_create_src_surface_state(ScrnInfoPtr scrn, uint32_t src_offset, int src_width, int src_height, int src_pitch, uint32_t src_surf_format) { + I830Ptr pI830 = I830PTR(scrn); + drm_intel_bo *surface_bo; + struct brw_surface_state *src_surf_state; + + surface_bo = drm_intel_bo_alloc(pI830->bufmgr, + "textured video surface state", + 4096, 4096); + drm_intel_bo_map(surface_bo, TRUE); + src_surf_state = surface_bo->virtual; + /* Set up the source surface state buffer */ memset(src_surf_state, 0, sizeof(struct brw_surface_state)); src_surf_state->ss0.surface_type = BRW_SURFACE_2D; @@ -407,6 +426,34 @@ i965_set_src_surface_state(ScrnInfoPtr scrn, src_surf_state->ss2.mip_count = 0; src_surf_state->ss2.render_target_rotation = 0; src_surf_state->ss3.pitch = src_pitch - 1; + + drm_intel_bo_unmap(surface_bo); + return surface_bo; +} + +static drm_intel_bo * +i965_create_binding_table(ScrnInfoPtr scrn, drm_intel_bo **surf_bos, int n_surf) +{ + I830Ptr pI830 = I830PTR(scrn); + drm_intel_bo *bind_bo; + uint32_t *binding_table; + int i; + + /* Set up a binding table for our surfaces. Only the PS will use it */ + + bind_bo = drm_intel_bo_alloc(pI830->bufmgr, + "textured video binding table", + 4096, 4096); + drm_intel_bo_map(bind_bo, TRUE); + binding_table = bind_bo->virtual; + + for (i = 0; i < n_surf; i++) + binding_table[i] = intel_emit_reloc(bind_bo, i * sizeof(uint32_t), + surf_bos[i], 0, + I915_GEM_DOMAIN_INSTRUCTION, 0); + + drm_intel_bo_unmap(bind_bo); + return bind_bo; } static drm_intel_bo * @@ -662,20 +709,14 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id, int urb_sf_start, urb_sf_size; int urb_cs_start, urb_cs_size; float src_scale_x, src_scale_y; - uint32_t *binding_table; - int dest_surf_offset, src_surf_offset[6]; - int binding_table_offset; - int next_offset, total_state_size; - char *state_base; - int state_base_offset; - int src_surf; + int src_surf, i; int n_src_surf; uint32_t src_surf_format; uint32_t src_surf_base[6]; int src_width[6]; int src_height[6]; int src_pitch[6]; - int wm_binding_table_entries; + drm_intel_bo *bind_bo, *surf_bos[7]; #if 0 ErrorF("BroadwaterDisplayVideoTextured: %dx%d (pitch %d)\n", width, height, @@ -733,44 +774,13 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id, default: return; } - wm_binding_table_entries = 1 + n_src_surf; IntelEmitInvarientState(pScrn); *pI830->last_3d = LAST_3D_VIDEO; - next_offset = 0; - - /* Set up our layout of state in framebuffer: */ - /* And then the general state: */ - dest_surf_offset = ALIGN(next_offset, 32); - next_offset = dest_surf_offset + sizeof(struct brw_surface_state); - - for (src_surf = 0; src_surf < n_src_surf; src_surf++) { - src_surf_offset[src_surf] = ALIGN(next_offset, 32); - next_offset = src_surf_offset[src_surf] + sizeof(struct brw_surface_state); - } - - binding_table_offset = ALIGN(next_offset, 32); - next_offset = binding_table_offset + (wm_binding_table_entries * 4); - - /* Allocate an area in framebuffer for our state layout we just set up */ - total_state_size = next_offset; - assert (total_state_size < BRW_LINEAR_EXTRA); - - /* - * Use the extra space allocated at the end of the Xv buffer - */ - state_base_offset = pPriv->extra_offset; - state_base_offset = ALIGN(state_base_offset, 64); - - state_base = (char *)(pI830->FbBase + state_base_offset); - - binding_table = (void *)(state_base + binding_table_offset); - #if 0 ErrorF("dst surf: 0x%08x\n", state_base_offset + dest_surf_offset); ErrorF("src surf: 0x%08x\n", state_base_offset + src_surf_offset); - ErrorF("binding table: 0x%08x\n", state_base_offset + binding_table_offset); #endif urb_vs_start = 0; @@ -790,24 +800,22 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id, */ /* Upload kernels */ - i965_set_dst_surface_state(pScrn, (void *)(state_base + - dest_surf_offset), - pPixmap); - - for (src_surf = 0; src_surf < n_src_surf; src_surf++) - i965_set_src_surface_state(pScrn, - (void *)(state_base + - src_surf_offset[src_surf]), - src_surf_base[src_surf], - src_width[src_surf], - src_height[src_surf], - src_pitch[src_surf], - src_surf_format); + surf_bos[0] = i965_create_dst_surface_state(pScrn, pPixmap); - /* Set up a binding table for our surfaces. Only the PS will use it */ - binding_table[0] = state_base_offset + dest_surf_offset; - for (src_surf = 0; src_surf < n_src_surf; src_surf++) - binding_table[1 + src_surf] = state_base_offset + src_surf_offset[src_surf]; + for (src_surf = 0; src_surf < n_src_surf; src_surf++) { + surf_bos[src_surf + 1] = + i965_create_src_surface_state(pScrn, + src_surf_base[src_surf], + src_width[src_surf], + src_height[src_surf], + src_pitch[src_surf], + src_surf_format); + } + bind_bo = i965_create_binding_table(pScrn, surf_bos, n_src_surf + 1); + for (i = 0; i < n_src_surf + 1; i++) { + drm_intel_bo_unreference(surf_bos[i]); + surf_bos[i] = NULL; + } if (pI830->video.gen4_sampler_bo == NULL) pI830->video.gen4_sampler_bo = i965_create_sampler_state(pScrn); @@ -900,7 +908,8 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id, OUT_BATCH(0); /* clip */ OUT_BATCH(0); /* sf */ /* Only the PS uses the binding table */ - OUT_BATCH(state_base_offset + binding_table_offset); /* ps */ + OUT_RELOC(bind_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); + drm_intel_bo_unreference(bind_bo); /* Blend constant color (magenta is fun) */ OUT_BATCH(BRW_3DSTATE_CONSTANT_COLOR | 3); |