summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2008-12-04 11:44:35 -0800
committerEric Anholt <eric@anholt.net>2008-12-04 17:48:44 -0800
commit61929f4c641e2ecb145ad2b22f7092d40e31ae6d (patch)
tree27a3bb9dc6f4bb08f93a7b6a2df08cdc8abb5104
parent73d03cb93ca761ee555b87558882e26bd2f10d91 (diff)
Move I965DisplayVideoTextured surface/sampler setup to separate functions.
-rw-r--r--src/i965_video.c163
1 files changed, 92 insertions, 71 deletions
diff --git a/src/i965_video.c b/src/i965_video.c
index 1900f2a3..f9a9ff00 100644
--- a/src/i965_video.c
+++ b/src/i965_video.c
@@ -301,6 +301,85 @@ i965_post_draw_debug(ScrnInfoPtr scrn)
#endif
}
+static void
+i965_set_dst_surface_state(ScrnInfoPtr scrn,
+ struct brw_surface_state *dest_surf_state,
+ PixmapPtr pixmap)
+{
+ I830Ptr pI830 = I830PTR(scrn);
+
+ memset(dest_surf_state, 0, sizeof(*dest_surf_state));
+ dest_surf_state->ss0.surface_type = BRW_SURFACE_2D;
+ dest_surf_state->ss0.data_return_format = BRW_SURFACERETURNFORMAT_FLOAT32;
+ if (pI830->cpp == 2) {
+ dest_surf_state->ss0.surface_format = BRW_SURFACEFORMAT_B5G6R5_UNORM;
+ } else {
+ dest_surf_state->ss0.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
+ }
+ dest_surf_state->ss0.writedisable_alpha = 0;
+ dest_surf_state->ss0.writedisable_red = 0;
+ dest_surf_state->ss0.writedisable_green = 0;
+ dest_surf_state->ss0.writedisable_blue = 0;
+ dest_surf_state->ss0.color_blend = 1;
+ dest_surf_state->ss0.vert_line_stride = 0;
+ dest_surf_state->ss0.vert_line_stride_ofs = 0;
+ dest_surf_state->ss0.mipmap_layout_mode = 0;
+ dest_surf_state->ss0.render_cache_read_mode = 0;
+
+ dest_surf_state->ss1.base_addr = intel_get_pixmap_offset(pixmap);
+ dest_surf_state->ss2.height = scrn->virtualY - 1;
+ dest_surf_state->ss2.width = scrn->virtualX - 1;
+ dest_surf_state->ss2.mip_count = 0;
+ dest_surf_state->ss2.render_target_rotation = 0;
+ 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 */
+}
+
+static void
+i965_set_src_surface_state(ScrnInfoPtr scrn,
+ struct brw_surface_state *src_surf_state,
+ uint32_t src_offset,
+ int src_width,
+ int src_height,
+ int src_pitch,
+ uint32_t src_surf_format)
+{
+ /* 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;
+ src_surf_state->ss0.surface_format = src_surf_format;
+ src_surf_state->ss0.writedisable_alpha = 0;
+ src_surf_state->ss0.writedisable_red = 0;
+ src_surf_state->ss0.writedisable_green = 0;
+ src_surf_state->ss0.writedisable_blue = 0;
+ src_surf_state->ss0.color_blend = 1;
+ src_surf_state->ss0.vert_line_stride = 0;
+ src_surf_state->ss0.vert_line_stride_ofs = 0;
+ src_surf_state->ss0.mipmap_layout_mode = 0;
+ src_surf_state->ss0.render_cache_read_mode = 0;
+
+ src_surf_state->ss1.base_addr = src_offset;
+ src_surf_state->ss2.width = src_width - 1;
+ src_surf_state->ss2.height = src_height - 1;
+ src_surf_state->ss2.mip_count = 0;
+ src_surf_state->ss2.render_target_rotation = 0;
+ src_surf_state->ss3.pitch = src_pitch - 1;
+}
+
+static void
+i965_set_sampler_state(ScrnInfoPtr scrn,
+ struct brw_sampler_state *sampler_state)
+{
+ memset(sampler_state, 0, sizeof(struct brw_sampler_state));
+
+ sampler_state->ss0.min_filter = BRW_MAPFILTER_LINEAR;
+ sampler_state->ss0.mag_filter = BRW_MAPFILTER_LINEAR;
+ sampler_state->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
+ sampler_state->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
+ sampler_state->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
+}
+
void
I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
RegionPtr dstRegion,
@@ -318,9 +397,6 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
int urb_clip_start, urb_clip_size;
int urb_sf_start, urb_sf_size;
int urb_cs_start, urb_cs_size;
- struct brw_surface_state *dest_surf_state;
- struct brw_surface_state *src_surf_state[6];
- struct brw_sampler_state *src_sampler_state[6];
struct brw_vs_unit_state *vs_state;
struct brw_sf_unit_state *sf_state;
struct brw_wm_unit_state *wm_state;
@@ -454,7 +530,7 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
/* And then the general state: */
dest_surf_offset = ALIGN(next_offset, 32);
- next_offset = dest_surf_offset + sizeof(*dest_surf_state);
+ 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);
@@ -488,13 +564,6 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
sip_kernel = (void *)(state_base + sip_kernel_offset);
cc_viewport = (void *)(state_base + cc_viewport_offset);
- dest_surf_state = (void *)(state_base + dest_surf_offset);
-
- for (src_surf = 0; src_surf < n_src_surf; src_surf++)
- {
- src_surf_state[src_surf] = (void *)(state_base + src_surf_offset[src_surf]);
- src_sampler_state[src_surf] = (void *)(state_base + src_sampler_offset[src_surf]);
- }
binding_table = (void *)(state_base + binding_table_offset);
vb = (void *)(state_base + vb_offset);
@@ -579,58 +648,18 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
/* Upload system kernel */
memcpy (sip_kernel, sip_kernel_static, sizeof (sip_kernel_static));
- /* Set up the state buffer for the destination surface */
- memset(dest_surf_state, 0, sizeof(*dest_surf_state));
- dest_surf_state->ss0.surface_type = BRW_SURFACE_2D;
- dest_surf_state->ss0.data_return_format = BRW_SURFACERETURNFORMAT_FLOAT32;
- if (pI830->cpp == 2) {
- dest_surf_state->ss0.surface_format = BRW_SURFACEFORMAT_B5G6R5_UNORM;
- } else {
- dest_surf_state->ss0.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
- }
- dest_surf_state->ss0.writedisable_alpha = 0;
- dest_surf_state->ss0.writedisable_red = 0;
- dest_surf_state->ss0.writedisable_green = 0;
- dest_surf_state->ss0.writedisable_blue = 0;
- dest_surf_state->ss0.color_blend = 1;
- dest_surf_state->ss0.vert_line_stride = 0;
- dest_surf_state->ss0.vert_line_stride_ofs = 0;
- dest_surf_state->ss0.mipmap_layout_mode = 0;
- dest_surf_state->ss0.render_cache_read_mode = 0;
-
- dest_surf_state->ss1.base_addr = intel_get_pixmap_offset(pPixmap);
- dest_surf_state->ss2.height = pScrn->virtualY - 1;
- dest_surf_state->ss2.width = pScrn->virtualX - 1;
- dest_surf_state->ss2.mip_count = 0;
- dest_surf_state->ss2.render_target_rotation = 0;
- dest_surf_state->ss3.pitch = intel_get_pixmap_pitch(pPixmap) - 1;
- dest_surf_state->ss3.tiled_surface = i830_pixmap_tiled(pPixmap);
- dest_surf_state->ss3.tile_walk = 0; /* TileX */
+ i965_set_dst_surface_state(pScrn, (void *)(state_base + dest_surf_offset),
+ pPixmap);
for (src_surf = 0; src_surf < n_src_surf; src_surf++)
- {
- /* Set up the source surface state buffer */
- memset(src_surf_state[src_surf], 0, sizeof(struct brw_surface_state));
- src_surf_state[src_surf]->ss0.surface_type = BRW_SURFACE_2D;
- src_surf_state[src_surf]->ss0.surface_format = src_surf_format;
- src_surf_state[src_surf]->ss0.writedisable_alpha = 0;
- src_surf_state[src_surf]->ss0.writedisable_red = 0;
- src_surf_state[src_surf]->ss0.writedisable_green = 0;
- src_surf_state[src_surf]->ss0.writedisable_blue = 0;
- src_surf_state[src_surf]->ss0.color_blend = 1;
- src_surf_state[src_surf]->ss0.vert_line_stride = 0;
- src_surf_state[src_surf]->ss0.vert_line_stride_ofs = 0;
- src_surf_state[src_surf]->ss0.mipmap_layout_mode = 0;
- src_surf_state[src_surf]->ss0.render_cache_read_mode = 0;
-
- src_surf_state[src_surf]->ss1.base_addr = src_surf_base[src_surf];
- src_surf_state[src_surf]->ss2.width = src_width[src_surf] - 1;
- src_surf_state[src_surf]->ss2.height = src_height[src_surf] - 1;
- src_surf_state[src_surf]->ss2.mip_count = 0;
- src_surf_state[src_surf]->ss2.render_target_rotation = 0;
- src_surf_state[src_surf]->ss3.pitch = src_pitch[src_surf] - 1;
- }
- /* FIXME: account for tiling if we ever do it */
+ 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);
/* Set up a binding table for our two surfaces. Only the PS will use it */
/* XXX: are these offset from the right place? */
@@ -639,17 +668,9 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
for (src_surf = 0; src_surf < n_src_surf; src_surf++)
binding_table[1 + src_surf] = state_base_offset + src_surf_offset[src_surf];
- /* Set up the packed YUV source sampler. Doesn't do colorspace conversion.
- */
for (src_surf = 0; src_surf < n_src_surf; src_surf++)
- {
- memset(src_sampler_state[src_surf], 0, sizeof(struct brw_sampler_state));
- src_sampler_state[src_surf]->ss0.min_filter = BRW_MAPFILTER_LINEAR;
- src_sampler_state[src_surf]->ss0.mag_filter = BRW_MAPFILTER_LINEAR;
- src_sampler_state[src_surf]->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
- src_sampler_state[src_surf]->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
- src_sampler_state[src_surf]->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
- }
+ i965_set_sampler_state(pScrn, (void *)(state_base +
+ src_sampler_offset[src_surf]));
/* Set up the vertex shader to be disabled (passthrough) */
memset(vs_state, 0, sizeof(*vs_state));