summaryrefslogtreecommitdiff
path: root/src/gen8_render.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gen8_render.c')
-rw-r--r--src/gen8_render.c138
1 files changed, 77 insertions, 61 deletions
diff --git a/src/gen8_render.c b/src/gen8_render.c
index a3ff1e6e..a89eb483 100644
--- a/src/gen8_render.c
+++ b/src/gen8_render.c
@@ -73,6 +73,10 @@ static const uint32_t ps_subpic_kernel_static_gen8[][4] = {
#include "shaders/render/exa_wm_write.g8b"
};
+static const uint32_t ps_clear_kernel_static_gen8[][4] = {
+#include "shaders/render/exa_wm_src_affine.g8b"
+#include "shaders/render/exa_wm_clear.g8b"
+};
#define SURFACE_STATE_PADDED_SIZE SURFACE_STATE_PADDED_SIZE_GEN8
@@ -82,7 +86,8 @@ static const uint32_t ps_subpic_kernel_static_gen8[][4] = {
enum {
SF_KERNEL = 0,
PS_KERNEL,
- PS_SUBPIC_KERNEL
+ PS_SUBPIC_KERNEL,
+ PS_CLEAR_KERNEL
};
static struct i965_kernel render_kernels_gen8[] = {
@@ -107,6 +112,14 @@ static struct i965_kernel render_kernels_gen8[] = {
ps_subpic_kernel_static_gen8,
sizeof(ps_subpic_kernel_static_gen8),
NULL
+ },
+
+ {
+ "PS_CLEAR",
+ PS_CLEAR_KERNEL,
+ ps_clear_kernel_static_gen8,
+ sizeof(ps_clear_kernel_static_gen8),
+ NULL
}
};
@@ -347,7 +360,8 @@ static void
i965_fill_vertex_buffer(
VADriverContextP ctx,
float tex_coords[4], /* [(u1,v1);(u2,v2)] */
- float vid_coords[4] /* [(x1,y1);(x2,y2)] */
+ float vid_coords[4], /* [(x1,y1);(x2,y2)] */
+ int offset
)
{
struct i965_driver_data * const i965 = i965_driver_data(ctx);
@@ -380,7 +394,7 @@ i965_fill_vertex_buffer(
vb[10] = vid_coords[X1];
vb[11] = vid_coords[Y1];
- dri_bo_subdata(i965->render_state.vb.vertex_buffer, 0, sizeof(vb), vb);
+ dri_bo_subdata(i965->render_state.vb.vertex_buffer, offset, sizeof(vb), vb);
}
static void
@@ -414,7 +428,7 @@ i965_subpic_render_upload_vertex(VADriverContextP ctx,
vid_coords[2] = (float)(dst_rect.x + dst_rect.width);
vid_coords[3] = (float)(dst_rect.y + dst_rect.height);
- i965_fill_vertex_buffer(ctx, tex_coords, vid_coords);
+ i965_fill_vertex_buffer(ctx, tex_coords, vid_coords, 0);
}
static void
@@ -444,7 +458,24 @@ i965_render_upload_vertex(
vid_coords[2] = vid_coords[0] + dst_rect->width;
vid_coords[3] = vid_coords[1] + dst_rect->height;
- i965_fill_vertex_buffer(ctx, tex_coords, vid_coords);
+ i965_fill_vertex_buffer(ctx, tex_coords, vid_coords, 0);
+
+ /*
+ * The vertices below are for background, and always set tex-coordinates
+ * although the tex-coordinates are not used in the the corresponding PS
+ * kernel.
+ */
+ tex_coords[0] = 0.0F;
+ tex_coords[1] = 0.0F;
+ tex_coords[2] = 1.0F;
+ tex_coords[3] = 1.0F;
+
+ vid_coords[0] = dest_region->x;
+ vid_coords[1] = dest_region->y;
+ vid_coords[2] = vid_coords[0] + dest_region->width;
+ vid_coords[3] = vid_coords[1] + dest_region->height;
+
+ i965_fill_vertex_buffer(ctx, tex_coords, vid_coords, 12 * sizeof(float));
}
static void
@@ -491,53 +522,6 @@ i965_render_upload_image_palette(
ADVANCE_BATCH(batch);
}
-static void
-gen8_clear_dest_region(VADriverContextP ctx)
-{
- struct i965_driver_data *i965 = i965_driver_data(ctx);
- struct intel_batchbuffer *batch = i965->batch;
- struct i965_render_state *render_state = &i965->render_state;
- struct intel_region *dest_region = render_state->draw_region;
- unsigned int blt_cmd, br13;
- int pitch;
-
- blt_cmd = GEN8_XY_COLOR_BLT_CMD;
- br13 = 0xf0 << 16;
- pitch = dest_region->pitch;
-
- if (dest_region->cpp == 4) {
- br13 |= BR13_8888;
- blt_cmd |= (XY_COLOR_BLT_WRITE_RGB | XY_COLOR_BLT_WRITE_ALPHA);
- } else {
- assert(dest_region->cpp == 2);
- br13 |= BR13_565;
- }
-
- if (dest_region->tiling != I915_TILING_NONE) {
- blt_cmd |= XY_COLOR_BLT_DST_TILED;
- pitch /= 4;
- }
-
- br13 |= pitch;
-
- intel_batchbuffer_start_atomic_blt(batch, 24);
- BEGIN_BLT_BATCH(batch, 7);
-
- OUT_BATCH(batch, blt_cmd);
- OUT_BATCH(batch, br13);
- OUT_BATCH(batch, (dest_region->y << 16) | (dest_region->x));
- OUT_BATCH(batch, ((dest_region->y + dest_region->height) << 16) |
- (dest_region->x + dest_region->width));
- OUT_RELOC(batch, dest_region->bo,
- I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER,
- 0);
- OUT_BATCH(batch, 0x0);
- OUT_BATCH(batch, 0x0);
- ADVANCE_BATCH(batch);
- intel_batchbuffer_end_atomic(batch);
-}
-
-
/*
* for GEN8
*/
@@ -890,7 +874,7 @@ gen8_emit_cc_state_pointers(VADriverContextP ctx)
}
static void
-gen8_emit_vertices(VADriverContextP ctx)
+gen8_emit_vertices(VADriverContextP ctx, int offset)
{
struct i965_driver_data *i965 = i965_driver_data(ctx);
struct intel_batchbuffer *batch = i965->batch;
@@ -903,7 +887,7 @@ gen8_emit_vertices(VADriverContextP ctx)
(0 << GEN8_VB0_MOCS_SHIFT) |
GEN7_VB0_ADDRESS_MODIFYENABLE |
((4 * 4) << VB0_BUFFER_PITCH_SHIFT));
- OUT_RELOC(batch, render_state->vb.vertex_buffer, I915_GEM_DOMAIN_VERTEX, 0, 0);
+ OUT_RELOC(batch, render_state->vb.vertex_buffer, I915_GEM_DOMAIN_VERTEX, 0, offset);
OUT_BATCH(batch, 0);
OUT_BATCH(batch, 12 * 4);
ADVANCE_BATCH(batch);
@@ -1382,7 +1366,8 @@ gen8_emit_wm_state(VADriverContextP ctx, int kernel)
(GEN8_PSX_PIXEL_SHADER_VALID | GEN8_PSX_ATTRIBUTE_ENABLE));
ADVANCE_BATCH(batch);
- if (kernel == PS_KERNEL) {
+ if (kernel == PS_KERNEL ||
+ kernel == PS_CLEAR_KERNEL) {
BEGIN_BATCH(batch, 2);
OUT_BATCH(batch, GEN8_3DSTATE_PSBLEND | (2 - 2));
OUT_BATCH(batch,
@@ -1571,7 +1556,39 @@ gen7_emit_drawing_rectangle(VADriverContextP ctx)
}
static void
-gen8_render_emit_states(VADriverContextP ctx, int kernel)
+gen8_render_emit_states(VADriverContextP ctx)
+{
+ struct i965_driver_data *i965 = i965_driver_data(ctx);
+ struct intel_batchbuffer *batch = i965->batch;
+
+ intel_batchbuffer_start_atomic(batch, 0x1000);
+ intel_batchbuffer_emit_mi_flush(batch);
+ gen8_emit_invarient_states(ctx);
+ gen8_emit_state_base_address(ctx);
+ gen8_emit_viewport_state_pointers(ctx);
+ gen8_emit_urb(ctx);
+ gen8_emit_cc_state_pointers(ctx);
+ gen8_emit_sampler_state_pointers(ctx);
+ gen8_emit_wm_hz_op(ctx);
+ gen8_emit_bypass_state(ctx);
+ gen8_emit_vs_state(ctx);
+ gen8_emit_clip_state(ctx);
+ gen8_emit_sf_state(ctx);
+ gen8_emit_depth_stencil_state(ctx);
+ gen8_emit_depth_buffer_state(ctx);
+ gen7_emit_drawing_rectangle(ctx);
+ gen8_emit_vertex_element_state(ctx);
+ /* clear background */
+ gen8_emit_wm_state(ctx, PS_CLEAR_KERNEL);
+ gen8_emit_vertices(ctx, 12 * sizeof(float));
+ /* draw the image */
+ gen8_emit_wm_state(ctx, PS_KERNEL);
+ gen8_emit_vertices(ctx, 0);
+ intel_batchbuffer_end_atomic(batch);
+}
+
+static void
+gen8_subpicture_render_emit_states(VADriverContextP ctx)
{
struct i965_driver_data *i965 = i965_driver_data(ctx);
struct intel_batchbuffer *batch = i965->batch;
@@ -1590,11 +1607,11 @@ gen8_render_emit_states(VADriverContextP ctx, int kernel)
gen8_emit_clip_state(ctx);
gen8_emit_sf_state(ctx);
gen8_emit_depth_stencil_state(ctx);
- gen8_emit_wm_state(ctx, kernel);
+ gen8_emit_wm_state(ctx, PS_SUBPIC_KERNEL);
gen8_emit_depth_buffer_state(ctx);
gen7_emit_drawing_rectangle(ctx);
gen8_emit_vertex_element_state(ctx);
- gen8_emit_vertices(ctx);
+ gen8_emit_vertices(ctx, 0);
intel_batchbuffer_end_atomic(batch);
}
@@ -1612,8 +1629,7 @@ gen8_render_put_surface(
gen8_render_initialize(ctx);
gen8_render_setup_states(ctx, obj_surface, src_rect, dst_rect, flags);
- gen8_clear_dest_region(ctx);
- gen8_render_emit_states(ctx, PS_KERNEL);
+ gen8_render_emit_states(ctx);
intel_batchbuffer_flush(batch);
}
@@ -1714,7 +1730,7 @@ gen8_render_put_subpicture(
assert(obj_subpic);
gen8_render_initialize(ctx);
gen8_subpicture_render_setup_states(ctx, obj_surface, src_rect, dst_rect);
- gen8_render_emit_states(ctx, PS_SUBPIC_KERNEL);
+ gen8_subpicture_render_emit_states(ctx);
i965_render_upload_image_palette(ctx, obj_subpic->obj_image, 0xff);
intel_batchbuffer_flush(batch);
}