| Top |
| #define | BATCH_SZ |
| #define | BATCH_RESERVED |
| struct | intel_batchbuffer |
| #define | I915_TILING_Yf |
| #define | I915_TILING_Ys |
| struct | igt_buf |
This library provides some basic support for batchbuffers and using the
blitter engine based upon libdrm. A new batchbuffer is allocated with
intel_batchbuffer_alloc() and for simple blitter commands submitted with
intel_batchbuffer_flush().
It also provides some convenient macros to easily emit commands into batchbuffers. All those macros presume that a pointer to a intel_batchbuffer structure called batch is in scope. The basic macros are BEGIN_BATCH, OUT_BATCH, OUT_RELOC and ADVANCE_BATCH.
Note that this library's header pulls in the i-g-t core library as a dependency.
struct intel_batchbuffer * intel_batchbuffer_alloc (drm_intel_bufmgr *bufmgr,uint32_t devid);
Allocates a new batchbuffer object. devid
must be supplied since libdrm
doesn't expose it directly.
void intel_batchbuffer_set_context (struct intel_batchbuffer *batch,drm_intel_context *ctx);
void
intel_batchbuffer_free (struct intel_batchbuffer *batch);
Releases all resource of the batchbuffer object batch
.
void
intel_batchbuffer_flush (struct intel_batchbuffer *batch);
Submits the batch for execution on the blitter engine, selecting the right ring depending upon the hardware platform.
void intel_batchbuffer_flush_on_ring (struct intel_batchbuffer *batch,int ring);
Submits the batch for execution on ring
.
void intel_batchbuffer_flush_with_context (struct intel_batchbuffer *batch,drm_intel_context *context);
Submits the batch for execution on the render engine with the supplied hardware context.
void
intel_batchbuffer_reset (struct intel_batchbuffer *batch);
Resets batch
by allocating a new gem buffer object as backing storage.
void intel_batchbuffer_data (struct intel_batchbuffer *batch,const void *data,unsigned int bytes);
This transfers the given data
into the batchbuffer. Note that the length
must be DWORD aligned, i.e. multiples of 32bits.
void intel_batchbuffer_emit_reloc (struct intel_batchbuffer *batch,drm_intel_bo *buffer,uint64_t delta,uint32_t read_domains,uint32_t write_domain,int fenced);
Emits both a libdrm relocation entry pointing at buffer
and the pre-computed
DWORD of batch
's presumed gpu address plus the supplied delta
into batch
.
Note that fenced
is only relevant if buffer
is actually tiled.
This is the only way buffers get added to the validate list.
void intel_batchbuffer_emit_dword (struct intel_batchbuffer *batch,uint32_t dword);
void intel_batchbuffer_require_space (struct intel_batchbuffer *batch,unsigned int sz);
#define BEGIN_BATCH(n, r)
Prepares a batch to emit n
DWORDS, flushing it if there's not enough space
available.
This macro needs a pointer to an intel_batchbuffer structure called batch in scope.
#define OUT_BATCH(d) intel_batchbuffer_emit_dword(batch, d)
Emits d
into a batch.
This macro needs a pointer to an intel_batchbuffer structure called batch in scope.
#define OUT_RELOC_FENCED(buf, read_domains, write_domain, delta)
Emits a fenced relocation into a batch.
This macro needs a pointer to an intel_batchbuffer structure called batch in scope.
#define OUT_RELOC(buf, read_domains, write_domain, delta)
Emits a normal, unfenced relocation into a batch.
This macro needs a pointer to an intel_batchbuffer structure called batch in scope.
#define ADVANCE_BATCH()
Completes the batch command emission sequence started with BEGIN_BATCH.
This macro needs a pointer to an intel_batchbuffer structure called batch in scope.
void intel_blt_copy (struct intel_batchbuffer *batch,drm_intel_bo *src_bo,int src_x1,int src_y1,int src_pitch,drm_intel_bo *dst_bo,int dst_x1,int dst_y1,int dst_pitch,int width,int height,int bpp);
This emits a 2D copy operation using blitter commands into the supplied batch buffer object.
batch |
batchbuffer object |
|
src_bo |
source libdrm buffer object |
|
src_x1 |
source pixel x-coordination |
|
src_y1 |
source pixel y-coordination |
|
src_pitch |
|
|
dst_bo |
destination libdrm buffer object |
|
dst_x1 |
destination pixel x-coordination |
|
dst_y1 |
destination pixel y-coordination |
|
dst_pitch |
|
|
width |
width of the copied rectangle |
|
height |
height of the copied rectangle |
|
bpp |
bits per pixel |
void intel_copy_bo (struct intel_batchbuffer *batch,drm_intel_bo *dst_bo,drm_intel_bo *src_bo,long int size);
This emits a copy operation using blitter commands into the supplied batch
buffer object. A total of size
bytes from the start of src_bo
is copied
over to dst_bo
. Note that size
must be page-aligned.
unsigned
igt_buf_width (struct igt_buf *buf);
Computes the width in 32-bit pixels of the given buffer.
unsigned
igt_buf_height (struct igt_buf *buf);
Computes the height in 32-bit pixels of the given buffer.
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);
Copy src
into dst
using the gen9 fast copy blitter command.
The source and destination surfaces cannot overlap.
batch |
batchbuffer object |
|
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 |
void igt_blitter_fast_copy__raw (int fd,uint32_t src_handle,unsigned int src_stride,unsigned int src_tiling,unsigned int src_x,unsigned src_y,unsigned int width,unsigned int height,uint32_t dst_handle,unsigned int dst_stride,unsigned int dst_tiling,unsigned int dst_x,unsigned dst_y);
Like igt_blitter_fast_copy(), but talking to the kernel directly.
fd |
file descriptor of the i915 driver |
|
src_handle |
GEM handle of the source buffer |
|
src_stride |
Stride (in bytes) of the source buffer |
|
src_tiling |
Tiling mode of the source buffer |
|
src_x |
X coordinate of the source region to copy |
|
src_y |
Y coordinate of the source region to copy |
|
width |
Width of the region to copy |
|
height |
Height of the region to copy |
|
dst_handle |
GEM handle of the source buffer |
|
dst_stride |
Stride (in bytes) of the destination buffer |
|
dst_tiling |
Tiling mode of the destination buffer |
|
dst_x |
X coordinate of destination |
|
dst_y |
Y coordinate of destination |
void (*igt_render_copyfunc_t) (struct intel_batchbuffer *batch,drm_intel_context *context,struct igt_buf *src,unsigned src_x,unsigned src_y,unsigned width,unsigned height,struct igt_buf *dst,unsigned dst_x,unsigned dst_y);
This is the type of the per-platform render copy functions. The
platform-specific implementation can be obtained by calling
igt_get_render_copyfunc().
A render copy function will emit a batchbuffer to the kernel which executes
the specified blit copy operation using the render engine. context
is
optional and can be NULL.
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 |
void (*igt_fillfunc_t) (struct intel_batchbuffer *batch,struct igt_buf *dst,unsigned x,unsigned y,unsigned width,unsigned height,uint8_t color);
This is the type of the per-platform fill functions using media
or gpgpu pipeline. The platform-specific implementation can be obtained
by calling igt_get_media_fillfunc() or igt_get_gpgpu_fillfunc().
A fill function will emit a batchbuffer to the kernel which executes the specified blit fill operation using the media/gpgpu engine.
void (*igt_media_spinfunc_t) (struct intel_batchbuffer *batch,struct igt_buf *dst,uint32_t spins);
This is the type of the per-platform media spin functions. The
platform-specific implementation can be obtained by calling
igt_get_media_spinfunc().
The media spin function emits a batchbuffer for the render engine with the media pipeline selected. The workload consists of a single thread which spins in a tight loop the requested number of times. Each spin increments a counter whose final 32-bit value is written to the destination buffer on completion. This utility provides a simple way to keep the render engine busy for a set time for various tests.
struct intel_batchbuffer {
drm_intel_bufmgr *bufmgr;
uint32_t devid;
int gen;
drm_intel_context *ctx;
drm_intel_bo *bo;
uint8_t buffer[BATCH_SZ];
uint8_t *ptr, *end;
uint8_t *state;
};