summaryrefslogtreecommitdiff
path: root/lib/rendercopy_gen7.c
diff options
context:
space:
mode:
authorKalamarz, Lukasz <lukasz.kalamarz@intel.com>2018-04-24 10:32:09 +0200
committerMichaƂ Winiarski <michal.winiarski@intel.com>2018-04-24 13:10:58 +0200
commit5d78609ef895c744ce261db268932f3856ca2638 (patch)
treede6eb3171a877b818605e6d97e40b2da9449fc3b /lib/rendercopy_gen7.c
parent66031862789413ba9e426191552b3b0d9b24bad1 (diff)
lib/rendercopy_gen7: Reorganizing batch allocations
This lib was written in a different manner than all other libs, which was causing some issues during refactoring. Previous implementation was using two pointers (ptr and state) to access two parts of batchbuffer in the same time. Current implementation is reusing ptr with a downside of needing to ensure the state/command ordering is proper. v3: Modified commit message and added batch boundary check v5: Rebase Signed-off-by: Lukasz Kalamarz <lukasz.kalamarz@intel.com> Cc: Katarzyna Dec <katarzyna.dec@intel.com> Cc: Radoslaw Szwichtenberg <radoslaw.szwichtenberg@intel.com> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> Reviewed-by: Katarzyna Dec <katarzyna.dec@intel.com> Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Diffstat (limited to 'lib/rendercopy_gen7.c')
-rw-r--r--lib/rendercopy_gen7.c77
1 files changed, 45 insertions, 32 deletions
diff --git a/lib/rendercopy_gen7.c b/lib/rendercopy_gen7.c
index 3b924061..2649ae32 100644
--- a/lib/rendercopy_gen7.c
+++ b/lib/rendercopy_gen7.c
@@ -35,7 +35,7 @@ static const uint32_t ps_kernel[][4] = {
static uint32_t
batch_used(struct intel_batchbuffer *batch)
{
- return batch->state - batch->buffer;
+ return batch->ptr - batch->buffer;
}
static uint32_t
@@ -43,7 +43,7 @@ batch_align(struct intel_batchbuffer *batch, uint32_t align)
{
uint32_t offset = batch_used(batch);
offset = ALIGN(offset, align);
- batch->state = batch->buffer + offset;
+ batch->ptr = batch->buffer + offset;
return offset;
}
@@ -51,7 +51,7 @@ static void *
batch_alloc(struct intel_batchbuffer *batch, uint32_t size, uint32_t align)
{
uint32_t offset = batch_align(batch, align);
- batch->state += size;
+ batch->ptr += size;
return memset(batch->buffer + offset, 0, size);
}
@@ -198,15 +198,9 @@ gen7_create_vertex_buffer(struct intel_batchbuffer *batch,
static void gen7_emit_vertex_buffer(struct intel_batchbuffer *batch,
int src_x, int src_y,
int dst_x, int dst_y,
- int width, int height)
+ int width, int height,
+ uint32_t offset)
{
- uint32_t offset;
-
- offset = gen7_create_vertex_buffer(batch,
- src_x, src_y,
- dst_x, dst_y,
- width, height);
-
OUT_BATCH(GEN7_3DSTATE_VERTEX_BUFFERS | (5 - 2));
OUT_BATCH(0 << GEN7_VB0_BUFFER_INDEX_SHIFT |
GEN7_VB0_VERTEXDATA |
@@ -238,10 +232,11 @@ gen7_bind_surfaces(struct intel_batchbuffer *batch,
static void
gen7_emit_binding_table(struct intel_batchbuffer *batch,
struct igt_buf *src,
- struct igt_buf *dst)
+ struct igt_buf *dst,
+ uint32_t bind_surf_off)
{
OUT_BATCH(GEN7_3DSTATE_BINDING_TABLE_POINTERS_PS | (2 - 2));
- OUT_BATCH(gen7_bind_surfaces(batch, src, dst));
+ OUT_BATCH(bind_surf_off);
}
static void
@@ -298,13 +293,14 @@ gen7_create_cc_viewport(struct intel_batchbuffer *batch)
}
static void
-gen7_emit_cc(struct intel_batchbuffer *batch)
+gen7_emit_cc(struct intel_batchbuffer *batch, uint32_t blend_state,
+ uint32_t cc_viewport)
{
- OUT_BATCH(GEN7_3DSTATE_BLEND_STATE_POINTERS | (2 - 2));
- OUT_BATCH(gen7_create_blend_state(batch));
+ OUT_BATCH(GEN7_3DSTATE_BLEND_STATE_POINTERS | (2 - 2));
+ OUT_BATCH(blend_state);
- OUT_BATCH(GEN7_3DSTATE_VIEWPORT_STATE_POINTERS_CC | (2 - 2));
- OUT_BATCH(gen7_create_cc_viewport(batch));
+ OUT_BATCH(GEN7_3DSTATE_VIEWPORT_STATE_POINTERS_CC | (2 - 2));
+ OUT_BATCH(cc_viewport);
}
static uint32_t
@@ -327,10 +323,10 @@ gen7_create_sampler(struct intel_batchbuffer *batch)
}
static void
-gen7_emit_sampler(struct intel_batchbuffer *batch)
+gen7_emit_sampler(struct intel_batchbuffer *batch, uint32_t sampler_off)
{
- OUT_BATCH(GEN7_3DSTATE_SAMPLER_STATE_POINTERS_PS | (2 - 2));
- OUT_BATCH(gen7_create_sampler(batch));
+ OUT_BATCH(GEN7_3DSTATE_SAMPLER_STATE_POINTERS_PS | (2 - 2));
+ OUT_BATCH(sampler_off);
}
static void
@@ -468,7 +464,7 @@ gen7_emit_sbe(struct intel_batchbuffer *batch)
}
static void
-gen7_emit_ps(struct intel_batchbuffer *batch)
+gen7_emit_ps(struct intel_batchbuffer *batch, uint32_t kernel_off)
{
int threads;
@@ -478,7 +474,7 @@ gen7_emit_ps(struct intel_batchbuffer *batch)
threads = 40 << IVB_PS_MAX_THREADS_SHIFT;
OUT_BATCH(GEN7_3DSTATE_PS | (8 - 2));
- OUT_BATCH(batch_copy(batch, ps_kernel, sizeof(ps_kernel), 64));
+ OUT_BATCH(kernel_off);
OUT_BATCH(1 << GEN7_PS_SAMPLER_COUNT_SHIFT |
2 << GEN7_PS_BINDING_TABLE_ENTRY_COUNT_SHIFT);
OUT_BATCH(0); /* scratch address */
@@ -535,12 +531,29 @@ void gen7_render_copyfunc(struct intel_batchbuffer *batch,
unsigned width, unsigned height,
struct igt_buf *dst, unsigned dst_x, unsigned dst_y)
{
+ uint32_t ps_binding_table, ps_sampler_off, ps_kernel_off;
+ uint32_t blend_state, cc_viewport;
+ uint32_t vertex_buffer;
uint32_t batch_end;
intel_batchbuffer_flush_with_context(batch, context);
- batch->state = &batch->buffer[BATCH_STATE_SPLIT];
+ batch->ptr = &batch->buffer[BATCH_STATE_SPLIT];
+
+ blend_state = gen7_create_blend_state(batch);
+ cc_viewport = gen7_create_cc_viewport(batch);
+ ps_sampler_off = gen7_create_sampler(batch);
+ ps_kernel_off = batch_copy(batch, ps_kernel, sizeof(ps_kernel), 64);
+ vertex_buffer = gen7_create_vertex_buffer(batch,
+ src_x, src_y,
+ dst_x, dst_y,
+ width, height);
+ ps_binding_table = gen7_bind_surfaces(batch, src, dst);
+
+ igt_assert(batch->ptr < &batch->buffer[4095]);
+
+ batch->ptr = batch->buffer;
OUT_BATCH(GEN7_PIPELINE_SELECT | PIPELINE_SELECT_3D);
gen7_emit_state_base_address(batch);
@@ -556,18 +569,18 @@ void gen7_render_copyfunc(struct intel_batchbuffer *batch,
gen7_emit_wm(batch);
gen7_emit_streamout(batch);
gen7_emit_null_depth_buffer(batch);
-
- gen7_emit_cc(batch);
- gen7_emit_sampler(batch);
+ gen7_emit_cc(batch, blend_state, cc_viewport);
+ gen7_emit_sampler(batch, ps_sampler_off);
gen7_emit_sbe(batch);
- gen7_emit_ps(batch);
+ gen7_emit_ps(batch, ps_kernel_off);
gen7_emit_vertex_elements(batch);
- gen7_emit_vertex_buffer(batch,
- src_x, src_y, dst_x, dst_y, width, height);
- gen7_emit_binding_table(batch, src, dst);
+ gen7_emit_vertex_buffer(batch, src_x, src_y,
+ dst_x, dst_y, width,
+ height, vertex_buffer);
+ gen7_emit_binding_table(batch, src, dst, ps_binding_table);
gen7_emit_drawing_rectangle(batch, dst);
- OUT_BATCH(GEN7_3DPRIMITIVE | (7- 2));
+ OUT_BATCH(GEN7_3DPRIMITIVE | (7 - 2));
OUT_BATCH(GEN7_3DPRIMITIVE_VERTEX_SEQUENTIAL | _3DPRIM_RECTLIST);
OUT_BATCH(3);
OUT_BATCH(0);