void i915_fill_blit(struct i915_context *i915, unsigned cpp, unsigned rgba_mask, unsigned short dst_pitch, struct i915_winsys_buffer *dst_buffer, unsigned dst_offset, short x, short y, short w, short h, unsigned color) { unsigned BR13, CMD; I915_DBG(DBG_BLIT, "%s dst:buf(%p)/%d+%d %d,%d sz:%dx%d\n", __FUNCTION__, dst_buffer, dst_pitch, dst_offset, x, y, w, h); if(!i915_winsys_validate_buffers(i915->batch, &dst_buffer, 1)) { FLUSH_BATCH(NULL); assert(i915_winsys_validate_buffers(i915->batch, &dst_buffer, 1)); } switch (cpp) { case 1: case 2: case 3: BR13 = (((int) dst_pitch) & 0xffff) | (0xF0 << 16) | (1 << 24); CMD = XY_COLOR_BLT_CMD; break; case 4: BR13 = (((int) dst_pitch) & 0xffff) | (0xF0 << 16) | (1 << 24) | (1 << 25); CMD = (XY_COLOR_BLT_CMD | rgba_mask); break; default: return; } if (!BEGIN_BATCH(6)) { FLUSH_BATCH(NULL); assert(BEGIN_BATCH(6)); } OUT_BATCH(CMD); OUT_BATCH(BR13); OUT_BATCH((y << 16) | x); OUT_BATCH(((y + h) << 16) | (x + w)); OUT_RELOC_FENCED(dst_buffer, I915_USAGE_2D_TARGET, dst_offset); OUT_BATCH(color); i915_set_flush_dirty(i915, I915_FLUSH_CACHE); }
void i915_fill_blit(struct i915_context *i915, unsigned cpp, unsigned short dst_pitch, struct intel_buffer *dst_buffer, unsigned dst_offset, short x, short y, short w, short h, unsigned color) { unsigned BR13, CMD; I915_DBG(i915, "%s dst:buf(%p)/%d+%d %d,%d sz:%dx%d\n", __FUNCTION__, dst_buffer, dst_pitch, dst_offset, x, y, w, h); switch (cpp) { case 1: case 2: case 3: BR13 = (((int) dst_pitch) & 0xffff) | (0xF0 << 16) | (1 << 24); CMD = XY_COLOR_BLT_CMD; break; case 4: BR13 = (((int) dst_pitch) & 0xffff) | (0xF0 << 16) | (1 << 24) | (1 << 25); CMD = (XY_COLOR_BLT_CMD | XY_COLOR_BLT_WRITE_ALPHA | XY_COLOR_BLT_WRITE_RGB); break; default: return; } if (!BEGIN_BATCH(6, 1)) { FLUSH_BATCH(NULL); assert(BEGIN_BATCH(6, 1)); } OUT_BATCH(CMD); OUT_BATCH(BR13); OUT_BATCH((y << 16) | x); OUT_BATCH(((y + h) << 16) | (x + w)); OUT_RELOC(dst_buffer, INTEL_USAGE_2D_TARGET, dst_offset); OUT_BATCH(color); FLUSH_BATCH(NULL); }
static void i915_flush_pipe( struct pipe_context *pipe, struct pipe_fence_handle **fence ) { struct i915_context *i915 = i915_context(pipe); draw_flush(i915->draw); if (i915->batch->map == i915->batch->ptr) { return; } /* If there are no flags, just flush pending commands to hardware: */ FLUSH_BATCH(fence); I915_DBG(DBG_FLUSH, "%s: #####\n", __FUNCTION__); }
static void i915_flush_pipe( struct pipe_context *pipe, struct pipe_fence_handle **fence, enum pipe_flush_flags flags ) { struct i915_context *i915 = i915_context(pipe); enum i915_winsys_flush_flags winsys_flags = I915_FLUSH_ASYNC; /* Only shortcut this if we have no fence, otherwise we must flush the * empty batchbuffer to get our fence back. */ if (!fence && i915->batch && (i915->batch->map == i915->batch->ptr)) { return; } if (flags == PIPE_FLUSH_END_OF_FRAME) winsys_flags = I915_FLUSH_END_OF_FRAME; FLUSH_BATCH(fence, winsys_flags); I915_DBG(DBG_FLUSH, "%s: #####\n", __FUNCTION__); }
void i915_copy_blit(struct i915_context *i915, unsigned cpp, unsigned short src_pitch, struct i915_winsys_buffer *src_buffer, unsigned src_offset, unsigned short dst_pitch, struct i915_winsys_buffer *dst_buffer, unsigned dst_offset, short src_x, short src_y, short dst_x, short dst_y, short w, short h) { unsigned CMD, BR13; int dst_y2 = dst_y + h; int dst_x2 = dst_x + w; struct i915_winsys_buffer *buffers[2] = {src_buffer, dst_buffer}; I915_DBG(DBG_BLIT, "%s src:buf(%p)/%d+%d %d,%d dst:buf(%p)/%d+%d %d,%d sz:%dx%d\n", __FUNCTION__, src_buffer, src_pitch, src_offset, src_x, src_y, dst_buffer, dst_pitch, dst_offset, dst_x, dst_y, w, h); if(!i915_winsys_validate_buffers(i915->batch, buffers, 2)) { FLUSH_BATCH(NULL); assert(i915_winsys_validate_buffers(i915->batch, buffers, 2)); } switch (cpp) { case 1: case 2: case 3: BR13 = (((int) dst_pitch) & 0xffff) | (0xCC << 16) | (1 << 24); CMD = XY_SRC_COPY_BLT_CMD; break; case 4: BR13 = (((int) dst_pitch) & 0xffff) | (0xCC << 16) | (1 << 24) | (1 << 25); CMD = (XY_SRC_COPY_BLT_CMD | XY_SRC_COPY_BLT_WRITE_ALPHA | XY_SRC_COPY_BLT_WRITE_RGB); break; default: return; } if (dst_y2 < dst_y || dst_x2 < dst_x) { return; } /* Hardware can handle negative pitches but loses the ability to do * proper overlapping blits in that case. We don't really have a * need for either at this stage. */ assert (dst_pitch > 0 && src_pitch > 0); if (!BEGIN_BATCH(8)) { FLUSH_BATCH(NULL); assert(BEGIN_BATCH(8)); } OUT_BATCH(CMD); OUT_BATCH(BR13); OUT_BATCH((dst_y << 16) | dst_x); OUT_BATCH((dst_y2 << 16) | dst_x2); OUT_RELOC_FENCED(dst_buffer, I915_USAGE_2D_TARGET, dst_offset); OUT_BATCH((src_y << 16) | src_x); OUT_BATCH(((int) src_pitch & 0xffff)); OUT_RELOC_FENCED(src_buffer, I915_USAGE_2D_SOURCE, src_offset); i915_set_flush_dirty(i915, I915_FLUSH_CACHE); }
void i915_copy_blit( struct i915_context *i915, unsigned do_flip, unsigned cpp, short src_pitch, struct pipe_buffer *src_buffer, unsigned src_offset, short dst_pitch, struct pipe_buffer *dst_buffer, unsigned dst_offset, short src_x, short src_y, short dst_x, short dst_y, short w, short h ) { unsigned CMD, BR13; int dst_y2 = dst_y + h; int dst_x2 = dst_x + w; I915_DBG(i915, "%s src:buf(%p)/%d+%d %d,%d dst:buf(%p)/%d+%d %d,%d sz:%dx%d\n", __FUNCTION__, src_buffer, src_pitch, src_offset, src_x, src_y, dst_buffer, dst_pitch, dst_offset, dst_x, dst_y, w, h); src_pitch *= (short) cpp; dst_pitch *= (short) cpp; switch (cpp) { case 1: case 2: case 3: BR13 = (((int) dst_pitch) & 0xffff) | (0xCC << 16) | (1 << 24); CMD = XY_SRC_COPY_BLT_CMD; break; case 4: BR13 = (((int) dst_pitch) & 0xffff) | (0xCC << 16) | (1 << 24) | (1 << 25); CMD = (XY_SRC_COPY_BLT_CMD | XY_SRC_COPY_BLT_WRITE_ALPHA | XY_SRC_COPY_BLT_WRITE_RGB); break; default: return; } if (dst_y2 < dst_y || dst_x2 < dst_x) { return; } /* Hardware can handle negative pitches but loses the ability to do * proper overlapping blits in that case. We don't really have a * need for either at this stage. */ assert (dst_pitch > 0 && src_pitch > 0); if (!BEGIN_BATCH(8, 2)) { FLUSH_BATCH(NULL); assert(BEGIN_BATCH(8, 2)); } OUT_BATCH(CMD); OUT_BATCH(BR13); OUT_BATCH((dst_y << 16) | dst_x); OUT_BATCH((dst_y2 << 16) | dst_x2); OUT_RELOC(dst_buffer, I915_BUFFER_ACCESS_WRITE, dst_offset); OUT_BATCH((src_y << 16) | src_x); OUT_BATCH(((int) src_pitch & 0xffff)); OUT_RELOC(src_buffer, I915_BUFFER_ACCESS_READ, src_offset); }