Signed-off-by: Kenneth Graunke <kenn...@whitecape.org>
---
 src/i965_render.c |   91 +++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 82 insertions(+), 9 deletions(-)

diff --git a/src/i965_render.c b/src/i965_render.c
index 5ab53c4..bb3c2b7 100644
--- a/src/i965_render.c
+++ b/src/i965_render.c
@@ -723,10 +723,10 @@ 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;
+#ifndef MAX
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+#endif
+#define SURFACE_STATE_PADDED_SIZE ALIGN(MAX(sizeof(struct brw_surface_state), 
sizeof(struct gen7_surface_state)), 32)
 
 struct gen4_cc_unit_state {
        /* Index by [src_blend][dst_blend] */
@@ -1161,7 +1161,7 @@ static sampler_state_extend_t 
sampler_state_extend_from_picture(int repeat_type)
  * picture in the given surface state buffer.
  */
 static int
-i965_set_picture_surface_state(intel_screen_private *intel,
+gen4_set_picture_surface_state(intel_screen_private *intel,
                               PicturePtr picture, PixmapPtr pixmap,
                               Bool is_dst)
 {
@@ -1215,7 +1215,70 @@ i965_set_picture_surface_state(intel_screen_private 
*intel,
                          priv->bo);
 
        offset = intel->surface_used;
-       intel->surface_used += sizeof(struct brw_surface_state_padded);
+       intel->surface_used += SURFACE_STATE_PADDED_SIZE;
+
+       if (is_dst)
+               priv->dst_bound = offset;
+       else
+               priv->src_bound = offset;
+
+       return offset;
+}
+
+static int
+gen7_set_picture_surface_state(intel_screen_private *intel,
+                              PicturePtr picture, PixmapPtr pixmap,
+                              Bool is_dst)
+{
+       struct intel_pixmap *priv = intel_get_pixmap_private(pixmap);
+       struct gen7_surface_state *ss;
+       uint32_t write_domain, read_domains;
+       int offset;
+
+       if (is_dst) {
+               write_domain = I915_GEM_DOMAIN_RENDER;
+               read_domains = I915_GEM_DOMAIN_RENDER;
+       } else {
+               write_domain = 0;
+               read_domains = I915_GEM_DOMAIN_SAMPLER;
+       }
+       intel_batch_mark_pixmap_domains(intel, priv,
+                                       read_domains, write_domain);
+       if (is_dst) {
+               if (priv->dst_bound)
+                       return priv->dst_bound;
+       } else {
+               if (priv->src_bound)
+                       return priv->src_bound;
+       }
+
+       ss = (struct gen7_surface_state *)
+               (intel->surface_data + intel->surface_used);
+
+       memset(ss, 0, sizeof(*ss));
+       ss->ss0.surface_type = BRW_SURFACE_2D;
+       if (is_dst)
+               ss->ss0.surface_format = i965_get_dest_format(picture);
+       else
+               ss->ss0.surface_format = i965_get_card_format(picture);
+
+       ss->ss0.tile_walk = 0;  /* Tiled X */
+       ss->ss0.tiled_surface = intel_pixmap_tiled(pixmap) ? 1 : 0;
+       ss->ss1.base_addr = priv->bo->offset;
+
+       ss->ss2.height = pixmap->drawable.height - 1;
+       ss->ss2.width = pixmap->drawable.width - 1;
+       ss->ss3.pitch = intel_pixmap_pitch(pixmap) - 1;
+
+       dri_bo_emit_reloc(intel->surface_bo,
+                         read_domains, write_domain,
+                         0,
+                         intel->surface_used +
+                         offsetof(struct gen7_surface_state, ss1),
+                         priv->bo);
+
+       offset = intel->surface_used;
+       intel->surface_used += SURFACE_STATE_PADDED_SIZE;
 
        if (is_dst)
                priv->dst_bound = offset;
@@ -1225,6 +1288,16 @@ i965_set_picture_surface_state(intel_screen_private 
*intel,
        return offset;
 }
 
+static inline int
+i965_set_picture_surface_state(intel_screen_private *intel,
+                              PicturePtr picture, PixmapPtr pixmap,
+                              Bool is_dst)
+{
+    if (INTEL_INFO(intel)->gen < 70)
+        return gen4_set_picture_surface_state(intel, picture, pixmap, is_dst);
+    return gen7_set_picture_surface_state(intel, picture, pixmap, is_dst);
+}
+
 static void gen4_composite_vertex_elements(struct intel_screen_private *intel)
 {
        struct gen4_render_state *render_state = intel->gen4_render_state;
@@ -1968,7 +2041,7 @@ i965_prepare_composite(int op, PicturePtr source_picture,
        }
 
        if (sizeof(intel->surface_data) - intel->surface_used <
-           4 * sizeof(struct brw_surface_state_padded))
+           4 * SURFACE_STATE_PADDED_SIZE)
                i965_surface_flush(intel);
 
        intel->needs_render_state_emit = TRUE;
@@ -2014,11 +2087,11 @@ static void i965_bind_surfaces(struct 
intel_screen_private *intel)
 {
        uint32_t *binding_table;
 
-       assert(intel->surface_used + 4 * sizeof(struct 
brw_surface_state_padded) <= sizeof(intel->surface_data));
+       assert(intel->surface_used + 4 * SURFACE_STATE_PADDED_SIZE <= 
sizeof(intel->surface_data));
 
        binding_table = (uint32_t*) (intel->surface_data + intel->surface_used);
        intel->surface_table = intel->surface_used;
-       intel->surface_used += sizeof(struct brw_surface_state_padded);
+       intel->surface_used += SURFACE_STATE_PADDED_SIZE;
 
        binding_table[0] =
                i965_set_picture_surface_state(intel,
-- 
1.7.4.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to