mirror of
https://github.com/tiagovignatti/intel-gpu-tools.git
synced 2025-06-19 22:06:13 +00:00
lib/skl: Add gen9 specific igt_blitter_fast_copy()
v2: Adjust for BB handling changes. (Tvrtko Ursulin) Correct XY_FAST_COPY_DST_TILING_Yf. (Tvrtko Ursulin) v3: New tiling modes are not defined in the kernel any more. (Tvrtko Ursulin) Signed-off-by: Damien Lespiau <damien.lespiau@intel.com> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
This commit is contained in:
parent
0c15e068a5
commit
cbd927cd35
@ -457,6 +457,112 @@ unsigned igt_buf_height(struct igt_buf *buf)
|
||||
return buf->size/buf->stride;
|
||||
}
|
||||
|
||||
/*
|
||||
* pitches are in bytes if the surfaces are linear, number of dwords
|
||||
* otherwise
|
||||
*/
|
||||
static uint32_t fast_copy_pitch(struct igt_buf *buf)
|
||||
{
|
||||
if (buf->tiling != I915_TILING_NONE)
|
||||
return buf->stride / 4;
|
||||
else
|
||||
return buf->stride;
|
||||
}
|
||||
|
||||
/**
|
||||
* igt_blitter_fast_copy:
|
||||
* @batch: batchbuffer object
|
||||
* @context: libdrm hardware context to use
|
||||
* @src: source i-g-t buffer object
|
||||
* @src_x: source pixel x-coordination
|
||||
* @src_y: source pixel y-coordination
|
||||
* @width: width of the copied rectangle
|
||||
* @height: height of the copied rectangle
|
||||
* @dst: destination i-g-t buffer object
|
||||
* @dst_x: destination pixel x-coordination
|
||||
* @dst_y: destination pixel y-coordination
|
||||
*
|
||||
* Copy @src into @dst using the gen9 fast copy blitter comamnd.
|
||||
*
|
||||
* The source and destination surfaces cannot overlap.
|
||||
*/
|
||||
void igt_blitter_fast_copy(struct intel_batchbuffer *batch,
|
||||
struct igt_buf *src, unsigned src_x, unsigned src_y,
|
||||
unsigned width, unsigned height,
|
||||
struct igt_buf *dst, unsigned dst_x, unsigned dst_y)
|
||||
{
|
||||
uint32_t src_pitch, dst_pitch;
|
||||
uint32_t dword0 = 0, dword1 = 0;
|
||||
|
||||
src_pitch = fast_copy_pitch(src);
|
||||
dst_pitch = fast_copy_pitch(dst);
|
||||
|
||||
#define CHECK_RANGE(x) ((x) >= 0 && (x) < (1 << 15))
|
||||
assert(CHECK_RANGE(src_x) && CHECK_RANGE(src_y) &&
|
||||
CHECK_RANGE(dst_x) && CHECK_RANGE(dst_y) &&
|
||||
CHECK_RANGE(width) && CHECK_RANGE(height) &&
|
||||
CHECK_RANGE(src_x + width) && CHECK_RANGE(src_y + height) &&
|
||||
CHECK_RANGE(dst_x + width) && CHECK_RANGE(dst_y + height) &&
|
||||
CHECK_RANGE(src_pitch) && CHECK_RANGE(dst_pitch));
|
||||
#undef CHECK_RANGE
|
||||
|
||||
dword0 |= XY_FAST_COPY_BLT;
|
||||
|
||||
switch (src->tiling) {
|
||||
case I915_TILING_X:
|
||||
dword0 |= XY_FAST_COPY_SRC_TILING_X;
|
||||
break;
|
||||
case I915_TILING_Y:
|
||||
case I915_TILING_Yf:
|
||||
dword0 |= XY_FAST_COPY_SRC_TILING_Yb_Yf;
|
||||
break;
|
||||
case I915_TILING_Ys:
|
||||
dword0 |= XY_FAST_COPY_SRC_TILING_Ys;
|
||||
break;
|
||||
case I915_TILING_NONE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (dst->tiling) {
|
||||
case I915_TILING_X:
|
||||
dword0 |= XY_FAST_COPY_DST_TILING_X;
|
||||
break;
|
||||
case I915_TILING_Y:
|
||||
case I915_TILING_Yf:
|
||||
dword0 |= XY_FAST_COPY_DST_TILING_Yb_Yf;
|
||||
break;
|
||||
case I915_TILING_Ys:
|
||||
dword0 |= XY_FAST_COPY_DST_TILING_Ys;
|
||||
break;
|
||||
case I915_TILING_NONE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (src->tiling == I915_TILING_Yf)
|
||||
dword1 |= XY_FAST_COPY_SRC_TILING_Yf;
|
||||
if (dst->tiling == I915_TILING_Yf)
|
||||
dword1 |= XY_FAST_COPY_DST_TILING_Yf;
|
||||
|
||||
dword1 |= XY_FAST_COPY_COLOR_DEPTH_32;
|
||||
|
||||
BEGIN_BATCH(10, 2);
|
||||
OUT_BATCH(dword0);
|
||||
OUT_BATCH(dword1 | dst_pitch);
|
||||
OUT_BATCH((dst_y << 16) | dst_x); /* dst x1,y1 */
|
||||
OUT_BATCH(((dst_y + height) << 16) | (dst_x + width)); /* dst x2,y2 */
|
||||
OUT_RELOC(dst->bo, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0);
|
||||
OUT_BATCH(0); /* dst address upper bits */
|
||||
OUT_BATCH((src_y << 16) | src_x); /* src x1,y1 */
|
||||
OUT_BATCH(src_pitch);
|
||||
OUT_RELOC(src->bo, I915_GEM_DOMAIN_RENDER, 0, 0);
|
||||
OUT_BATCH(0); /* src address upper bits */
|
||||
ADVANCE_BATCH();
|
||||
|
||||
intel_batchbuffer_flush(batch);
|
||||
}
|
||||
|
||||
/**
|
||||
* igt_get_render_copyfunc:
|
||||
* @devid: pci device id
|
||||
|
@ -185,6 +185,18 @@ void intel_copy_bo(struct intel_batchbuffer *batch,
|
||||
drm_intel_bo *dst_bo, drm_intel_bo *src_bo,
|
||||
long int size);
|
||||
|
||||
/**
|
||||
* Yf/Ys tiling
|
||||
*
|
||||
* Tiling mode in the I915_TILING_... namespace for new tiling modes which are
|
||||
* defined in the kernel. (They are not fenceable so the kernel does not need
|
||||
* to know about them.)
|
||||
*
|
||||
* They are to be used the the blitting routines below.
|
||||
*/
|
||||
#define I915_TILING_Yf 3
|
||||
#define I915_TILING_Ys 4
|
||||
|
||||
/**
|
||||
* igt_buf:
|
||||
* @bo: underlying libdrm buffer object
|
||||
@ -210,6 +222,11 @@ struct igt_buf {
|
||||
unsigned igt_buf_width(struct igt_buf *buf);
|
||||
unsigned igt_buf_height(struct igt_buf *buf);
|
||||
|
||||
void igt_blitter_fast_copy(struct intel_batchbuffer *batch,
|
||||
struct igt_buf *src, unsigned src_x, unsigned src_y,
|
||||
unsigned width, unsigned height,
|
||||
struct igt_buf *dst, unsigned dst_x, unsigned dst_y);
|
||||
|
||||
/**
|
||||
* igt_render_copyfunc_t:
|
||||
* @batch: batchbuffer object
|
||||
|
@ -2514,6 +2514,24 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#define XY_MONO_SRC_BLT_WRITE_ALPHA (1<<21)
|
||||
#define XY_MONO_SRC_BLT_WRITE_RGB (1<<20)
|
||||
|
||||
#define XY_FAST_COPY_BLT ((2<<29)|(0x42<<22)|0x8)
|
||||
/* dword 0 */
|
||||
#define XY_FAST_COPY_SRC_TILING_LINEAR (0 << 20)
|
||||
#define XY_FAST_COPY_SRC_TILING_X (1 << 20)
|
||||
#define XY_FAST_COPY_SRC_TILING_Yb_Yf (2 << 20)
|
||||
#define XY_FAST_COPY_SRC_TILING_Ys (3 << 20)
|
||||
#define XY_FAST_COPY_SRC_HORIZONTAL_ALIGNMENT(n) (n << 17)
|
||||
#define XY_FAST_COPY_SRC_VERTICAL_ALIGNMENT(n) (n << 15)
|
||||
#define XY_FAST_COPY_DST_TILING_X (1 << 13)
|
||||
#define XY_FAST_COPY_DST_TILING_Yb_Yf (2 << 13)
|
||||
#define XY_FAST_COPY_DST_TILING_Ys (3 << 13)
|
||||
#define XY_FAST_COPY_DST_HORIZONTAL_ALIGNMENT(n) (n << 10)
|
||||
#define XY_FAST_COPY_DST_VERTICAL_ALIGNMENT(n) (n << 8)
|
||||
/* dword 1 */
|
||||
#define XY_FAST_COPY_SRC_TILING_Yf (1 << 31)
|
||||
#define XY_FAST_COPY_DST_TILING_Yf (1 << 30)
|
||||
#define XY_FAST_COPY_COLOR_DEPTH_32 (3 << 24)
|
||||
|
||||
#define MI_STORE_DWORD_IMM ((0x20<<23)|2)
|
||||
#define MI_MEM_VIRTUAL (1 << 22) /* 965+ only */
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user