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
,int bpp
,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 |
|
bpp |
source and destination bits per pixel |
|
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
,int bpp
,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 |
|
bpp |
source and destination bits per pixel |
|
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; };