xf86-video-intel: src/i965_render.c

Eric Anholt anholt at kemper.freedesktop.org
Tue Apr 15 00:06:56 PDT 2008


 src/i965_render.c |  243 ++++++++++++++++++++----------------------------------
 1 file changed, 94 insertions(+), 149 deletions(-)

New commits:
commit 23d1df22d177e54bfc46304053d8115047ff85d4
Author: Eric Anholt <eric at anholt.net>
Date:   Mon Apr 14 16:46:17 2008 -0700

    Abstract surface setup into a separate function.

diff --git a/src/i965_render.c b/src/i965_render.c
index ef10a88..95ac063 100644
--- a/src/i965_render.c
+++ b/src/i965_render.c
@@ -432,6 +432,11 @@ typedef struct _brw_cc_unit_state_padded {
     char pad[64 - sizeof (struct brw_cc_unit_state)];
 } brw_cc_unit_state_padded;
 
+typedef struct brw_surface_state_padded {
+    struct brw_surface_state state;
+    char pad[32 - sizeof (struct brw_surface_state)];
+} brw_surface_state_padded;
+
 /**
  * Gen4 rendering state buffer structure.
  *
@@ -476,6 +481,11 @@ typedef struct _gen4_state {
 
     uint32_t binding_table[16]; /* Only use 3, but pad to 64 bytes */
 
+    struct brw_surface_state_padded dst_surface;
+    struct brw_surface_state_padded src_surface;
+    struct brw_surface_state_padded mask_surface;
+    uint8_t surface_pad[32];
+
     /* Index by [src_filter][src_extend][mask_filter][mask_extend].  Two of
      * the structs happen to add to 32 bytes.
      */
@@ -493,8 +503,6 @@ typedef struct _gen4_state {
     struct brw_cc_viewport cc_viewport;
     PAD64 (brw_cc_viewport, 0);
 
-    uint8_t other_state[65536];
-
     float vb[(2 + 3 + 3) * 3];   /* (dst, src, mask) 3 vertices, 4 bytes */
 } gen4_state_t;
 
@@ -796,6 +804,8 @@ i965_get_card_format(PicturePtr pPict)
 	if (i965_tex_formats[i].fmt == pPict->format)
 	    break;
     }
+    assert(i != sizeof(i965_tex_formats) / sizeof(i965_tex_formats[0]));
+
     return i965_tex_formats[i].card_fmt;
 }
 
@@ -825,6 +835,64 @@ sampler_state_extend_from_picture (int repeat)
     }
 }
 
+/**
+ * Sets up the common fields for a surface state buffer for the given picture
+ * in the surface state buffer at index, and returns the offset within the
+ * state buffer for this entry.
+ */
+static unsigned int
+i965_set_picture_surface_state(ScrnInfoPtr pScrn, struct brw_surface_state *ss,
+			       PicturePtr pPicture, PixmapPtr pPixmap,
+			       Bool is_dst)
+{
+    I830Ptr pI830 = I830PTR(pScrn);
+    struct gen4_render_state *render_state= pI830->gen4_render_state;
+    gen4_state_t *card_state = render_state->card_state;
+    struct brw_surface_state local_ss;
+    uint32_t offset;
+
+    /* Since ss is a pointer to WC memory, do all of our bit operations
+     * into a local temporary first.
+     */
+    memset(&local_ss, 0, sizeof(local_ss));
+    local_ss.ss0.surface_type = BRW_SURFACE_2D;
+    if (is_dst) {
+	uint32_t dst_format;
+
+	assert(i965_get_dest_format(pPicture, &dst_format) == TRUE);
+	local_ss.ss0.surface_format = dst_format;
+    } else {
+	local_ss.ss0.surface_format = i965_get_card_format(pPicture);
+    }
+
+    local_ss.ss0.data_return_format = BRW_SURFACERETURNFORMAT_FLOAT32;
+    local_ss.ss0.writedisable_alpha = 0;
+    local_ss.ss0.writedisable_red = 0;
+    local_ss.ss0.writedisable_green = 0;
+    local_ss.ss0.writedisable_blue = 0;
+    local_ss.ss0.color_blend = 1;
+    local_ss.ss0.vert_line_stride = 0;
+    local_ss.ss0.vert_line_stride_ofs = 0;
+    local_ss.ss0.mipmap_layout_mode = 0;
+    local_ss.ss0.render_cache_read_mode = 0;
+    local_ss.ss1.base_addr = intel_get_pixmap_offset(pPixmap);
+
+    local_ss.ss2.mip_count = 0;
+    local_ss.ss2.render_target_rotation = 0;
+    local_ss.ss2.height = pPixmap->drawable.height - 1;
+    local_ss.ss2.width = pPixmap->drawable.width - 1;
+    local_ss.ss3.pitch = intel_get_pixmap_pitch(pPixmap) - 1;
+    local_ss.ss3.tile_walk = 0; /* Tiled X */
+    local_ss.ss3.tiled_surface = i830_pixmap_tiled(pPixmap);
+
+    memcpy(ss, &local_ss, sizeof(local_ss));
+
+    offset = (char *)ss - (char *)card_state;
+    assert((offset & 31) == 0);
+
+    return offset;
+}
+
 Bool
 i965_prepare_composite(int op, PicturePtr pSrcPicture,
 		       PicturePtr pMaskPicture, PicturePtr pDstPicture,
@@ -832,12 +900,8 @@ i965_prepare_composite(int op, PicturePtr pSrcPicture,
 {
     ScrnInfoPtr pScrn = xf86Screens[pSrcPicture->pDrawable->pScreen->myNum];
     I830Ptr pI830 = I830PTR(pScrn);
-    gen4_state_t *card_state = pI830->gen4_render_state->card_state;
-    uint32_t src_offset, src_pitch, src_tile_format = 0, src_tiled = 0;
-    uint32_t mask_offset = 0, mask_pitch = 0, mask_tile_format = 0,
-	mask_tiled = 0;
-    uint32_t dst_format, dst_offset, dst_pitch, dst_tile_format = 0,
-	dst_tiled = 0;
+    struct gen4_render_state *render_state= pI830->gen4_render_state;
+    gen4_state_t *card_state = render_state->card_state;
     uint32_t sf_state_offset;
     sampler_state_filter_t src_filter, mask_filter;
     sampler_state_extend_t src_extend, mask_extend;
@@ -847,39 +911,13 @@ i965_prepare_composite(int op, PicturePtr pSrcPicture,
     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, dest_surf_state_local;
-    struct brw_surface_state *src_surf_state, src_surf_state_local;
-    struct brw_surface_state *mask_surf_state, mask_surf_state_local;
-    int dest_surf_offset, src_surf_offset, mask_surf_offset = 0;
-    int next_offset, total_state_size;
     char *state_base;
     int state_base_offset;
     uint32_t src_blend, dst_blend;
-    uint32_t *binding_table;
 
     IntelEmitInvarientState(pScrn);
     *pI830->last_3d = LAST_3D_RENDER;
 
-    src_offset = intel_get_pixmap_offset(pSrc);
-    src_pitch = intel_get_pixmap_pitch(pSrc);
-    if (i830_pixmap_tiled(pSrc)) {
-	src_tiled = 1;
-	src_tile_format = 0; /* Tiled X */
-    }
-    dst_offset = intel_get_pixmap_offset(pDst);
-    dst_pitch = intel_get_pixmap_pitch(pDst);
-    if (i830_pixmap_tiled(pDst)) {
-	dst_tiled = 1;
-	dst_tile_format = 0; /* Tiled X */
-    }
-    if (pMask) {
-	mask_offset = intel_get_pixmap_offset(pMask);
-	mask_pitch = intel_get_pixmap_pitch(pMask);
-	if (i830_pixmap_tiled(pMask)) {
-	    mask_tiled = 1;
-	    mask_tile_format = 0; /* Tiled X */
-	}
-    }
     pI830->scale_units[0][0] = pSrc->drawable.width;
     pI830->scale_units[0][1] = pSrc->drawable.height;
 
@@ -900,26 +938,6 @@ i965_prepare_composite(int op, PicturePtr pSrcPicture,
 
     is_affine = is_affine_src && is_affine_mask;
 
-    /* setup 3d pipeline state */
-
-    /* Set up our layout of state in framebuffer.  First the general state: */
-    next_offset = offsetof(gen4_state_t, other_state);
-
-    /* And then the general state: */
-    dest_surf_offset = ALIGN(next_offset, 32);
-    next_offset = dest_surf_offset + sizeof(*dest_surf_state);
-
-    src_surf_offset = ALIGN(next_offset, 32);
-    next_offset = src_surf_offset + sizeof(*src_surf_state);
-
-    if (pMask) {
-   	mask_surf_offset = ALIGN(next_offset, 32);
-   	next_offset = mask_surf_offset + sizeof(*mask_surf_state);
-    }
-
-    total_state_size = next_offset;
-    assert(total_state_size < sizeof(gen4_state_t));
-
     state_base_offset = pI830->gen4_render_state_mem->offset;
     assert((state_base_offset & 63) == 0);
     state_base = (char *)(pI830->FbBase + state_base_offset);
@@ -943,104 +961,28 @@ i965_prepare_composite(int op, PicturePtr pSrcPicture,
     i965_get_blend_cntl(op, pMaskPicture, pDstPicture->format,
 			&src_blend, &dst_blend);
 
-    /* Set up the state buffer for the destination surface */
-    dest_surf_state = &dest_surf_state_local;
-    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 (!i965_get_dest_format(pDstPicture, &dst_format))
-	return FALSE;
-    dest_surf_state->ss0.surface_format = dst_format;
-
-    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 = dst_offset;
-    dest_surf_state->ss2.height = pDst->drawable.height - 1;
-    dest_surf_state->ss2.width = pDst->drawable.width - 1;
-    dest_surf_state->ss2.mip_count = 0;
-    dest_surf_state->ss2.render_target_rotation = 0;
-    dest_surf_state->ss3.pitch = dst_pitch - 1;
-    dest_surf_state->ss3.tile_walk = dst_tile_format;
-    dest_surf_state->ss3.tiled_surface = dst_tiled;
-
-    dest_surf_state = (void *)(state_base + dest_surf_offset);
-    memcpy (dest_surf_state, &dest_surf_state_local, sizeof (dest_surf_state_local));
-
-    /* Set up the source surface state buffer */
-    src_surf_state = &src_surf_state_local;
-    memset(src_surf_state, 0, sizeof(*src_surf_state));
-    src_surf_state->ss0.surface_type = BRW_SURFACE_2D;
-    src_surf_state->ss0.surface_format = i965_get_card_format(pSrcPicture);
-
-    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 = pSrc->drawable.width - 1;
-    src_surf_state->ss2.height = pSrc->drawable.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;
-    src_surf_state->ss3.tile_walk = src_tile_format;
-    src_surf_state->ss3.tiled_surface = src_tiled;
-
-    src_surf_state = (void *)(state_base + src_surf_offset);
-    memcpy (src_surf_state, &src_surf_state_local, sizeof (src_surf_state_local));
-
-    /* setup mask surface */
+    /* Set up and bind the state buffer for the destination surface */
+    card_state->binding_table[0] = state_base_offset +
+	i965_set_picture_surface_state(pScrn,
+				       &card_state->dst_surface.state,
+				       pDstPicture, pDst, TRUE);
+
+    /* Set up and bind the source surface state buffer */
+    card_state->binding_table[1] = state_base_offset +
+	i965_set_picture_surface_state(pScrn,
+				       &card_state->src_surface.state,
+				       pSrcPicture, pSrc, FALSE);
     if (pMask) {
-	mask_surf_state = &mask_surf_state_local;
-   	memset(mask_surf_state, 0, sizeof(*mask_surf_state));
-	mask_surf_state->ss0.surface_type = BRW_SURFACE_2D;
-   	mask_surf_state->ss0.surface_format =
-	    i965_get_card_format(pMaskPicture);
-
-   	mask_surf_state->ss0.writedisable_alpha = 0;
-   	mask_surf_state->ss0.writedisable_red = 0;
-   	mask_surf_state->ss0.writedisable_green = 0;
-   	mask_surf_state->ss0.writedisable_blue = 0;
-   	mask_surf_state->ss0.color_blend = 1;
-   	mask_surf_state->ss0.vert_line_stride = 0;
-   	mask_surf_state->ss0.vert_line_stride_ofs = 0;
-   	mask_surf_state->ss0.mipmap_layout_mode = 0;
-   	mask_surf_state->ss0.render_cache_read_mode = 0;
-
-   	mask_surf_state->ss1.base_addr = mask_offset;
-   	mask_surf_state->ss2.width = pMask->drawable.width - 1;
-   	mask_surf_state->ss2.height = pMask->drawable.height - 1;
-   	mask_surf_state->ss2.mip_count = 0;
-   	mask_surf_state->ss2.render_target_rotation = 0;
-   	mask_surf_state->ss3.pitch = mask_pitch - 1;
-	mask_surf_state->ss3.tile_walk = mask_tile_format;
-	mask_surf_state->ss3.tiled_surface = mask_tiled;
-
-	mask_surf_state = (void *)(state_base + mask_surf_offset);
-	memcpy (mask_surf_state, &mask_surf_state_local, sizeof (mask_surf_state_local));
+	/* Set up and bind the mask surface state buffer */
+	card_state->binding_table[2] = state_base_offset +
+	    i965_set_picture_surface_state(pScrn,
+					   &card_state->mask_surface.state,
+					   pMaskPicture, pMask,
+					   FALSE);
+    } else {
+	card_state->binding_table[2] = 0;
     }
 
-    /* Set up a binding table for our surfaces.  Only the PS will use it */
-    binding_table = &card_state->binding_table[0];
-    binding_table[0] = state_base_offset + dest_surf_offset;
-    binding_table[1] = state_base_offset + src_surf_offset;
-    if (pMask)
-   	binding_table[2] = state_base_offset + mask_surf_offset;
-
-
     src_filter = sampler_state_filter_from_picture (pSrcPicture->filter);
     if (src_filter < 0)
 	I830FALLBACK ("Bad src filter 0x%x\n", pSrcPicture->filter);
@@ -1120,6 +1062,7 @@ i965_prepare_composite(int op, PicturePtr pSrcPicture,
 	OUT_BATCH(0); /* clip */
 	OUT_BATCH(0); /* sf */
 	/* Only the PS uses the binding table */
+	assert((offsetof(gen4_state_t, binding_table) & 31) == 0);
 	OUT_BATCH(state_base_offset + offsetof(gen4_state_t, binding_table));
 
 	/* The drawing rectangle clipping is always on.  Set it to values that
@@ -1196,6 +1139,8 @@ i965_prepare_composite(int op, PicturePtr pSrcPicture,
 #undef OUT_WM_KERNEL
 
 	/* 64 byte aligned */
+	assert((offsetof(gen4_state_t,
+			 cc_state[src_blend][dst_blend]) & 63) == 0);
 	OUT_BATCH(state_base_offset +
 		  offsetof(gen4_state_t, cc_state[src_blend][dst_blend]));
 


More information about the xorg-commit mailing list