mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-27 16:20:24 +01:00
freedreno: updates for msm drm/kms driver
There where some small API tweaks in libdrm_freedreno to enable support for msm drm/kms driver. Signed-off-by: Rob Clark <robclark@freedesktop.org>
This commit is contained in:
parent
4f0be333e7
commit
4fd03f26aa
8 changed files with 61 additions and 36 deletions
|
|
@ -137,7 +137,7 @@ emit_texture(struct fd_ringbuffer *ring, struct fd_context *ctx,
|
|||
OUT_RING(ring, 0x00010000 + (0x6 * const_idx));
|
||||
|
||||
OUT_RING(ring, sampler->tex0 | view->tex0);
|
||||
OUT_RELOC(ring, view->tex_resource->bo, 0, view->fmt);
|
||||
OUT_RELOC(ring, view->tex_resource->bo, 0, view->fmt, 0);
|
||||
OUT_RING(ring, view->tex2);
|
||||
OUT_RING(ring, sampler->tex3 | view->tex3);
|
||||
OUT_RING(ring, sampler->tex4);
|
||||
|
|
@ -171,7 +171,7 @@ fd2_emit_vertex_bufs(struct fd_ringbuffer *ring, uint32_t val,
|
|||
OUT_RING(ring, (0x1 << 16) | (val & 0xffff));
|
||||
for (i = 0; i < n; i++) {
|
||||
struct fd_resource *rsc = fd_resource(vbufs[i].prsc);
|
||||
OUT_RELOC(ring, rsc->bo, vbufs[i].offset, 3);
|
||||
OUT_RELOC(ring, rsc->bo, vbufs[i].offset, 3, 0);
|
||||
OUT_RING (ring, vbufs[i].size);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ emit_gmem2mem_surf(struct fd_ringbuffer *ring, uint32_t base,
|
|||
OUT_PKT3(ring, CP_SET_CONSTANT, 5);
|
||||
OUT_RING(ring, CP_REG(REG_A2XX_RB_COPY_CONTROL));
|
||||
OUT_RING(ring, 0x00000000); /* RB_COPY_CONTROL */
|
||||
OUT_RELOC(ring, rsc->bo, 0, 0); /* RB_COPY_DEST_BASE */
|
||||
OUT_RELOCW(ring, rsc->bo, 0, 0, 0); /* RB_COPY_DEST_BASE */
|
||||
OUT_RING(ring, rsc->pitch >> 5); /* RB_COPY_DEST_PITCH */
|
||||
OUT_RING(ring, /* RB_COPY_DEST_INFO */
|
||||
A2XX_RB_COPY_DEST_INFO_FORMAT(fd2_pipe2color(psurf->format)) |
|
||||
|
|
@ -199,7 +199,7 @@ emit_mem2gmem_surf(struct fd_ringbuffer *ring, uint32_t base,
|
|||
A2XX_SQ_TEX_0_CLAMP_Z(SQ_TEX_WRAP) |
|
||||
A2XX_SQ_TEX_0_PITCH(rsc->pitch));
|
||||
OUT_RELOC(ring, rsc->bo, 0,
|
||||
fd2_pipe2surface(psurf->format) | 0x800);
|
||||
fd2_pipe2surface(psurf->format) | 0x800, 0);
|
||||
OUT_RING(ring, A2XX_SQ_TEX_2_WIDTH(psurf->width - 1) |
|
||||
A2XX_SQ_TEX_2_HEIGHT(psurf->height - 1));
|
||||
OUT_RING(ring, 0x01000000 | // XXX
|
||||
|
|
@ -241,7 +241,7 @@ fd2_emit_tile_mem2gmem(struct fd_context *ctx, uint32_t xoff, uint32_t yoff,
|
|||
y0 = ((float)yoff) / ((float)pfb->height);
|
||||
y1 = ((float)yoff + bin_h) / ((float)pfb->height);
|
||||
OUT_PKT3(ring, CP_MEM_WRITE, 9);
|
||||
OUT_RELOC(ring, fd_resource(fd2_ctx->solid_vertexbuf)->bo, 0x60, 0);
|
||||
OUT_RELOC(ring, fd_resource(fd2_ctx->solid_vertexbuf)->bo, 0x60, 0, 0);
|
||||
OUT_RING(ring, fui(x0));
|
||||
OUT_RING(ring, fui(y0));
|
||||
OUT_RING(ring, fui(x1));
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ fd3_emit_constant(struct fd_ringbuffer *ring,
|
|||
if (prsc) {
|
||||
struct fd_bo *bo = fd_resource(prsc)->bo;
|
||||
OUT_RELOC(ring, bo, offset,
|
||||
CP_LOAD_STATE_1_STATE_TYPE(ST_CONSTANTS));
|
||||
CP_LOAD_STATE_1_STATE_TYPE(ST_CONSTANTS), 0);
|
||||
} else {
|
||||
OUT_RING(ring, CP_LOAD_STATE_1_EXT_SRC_ADDR(0) |
|
||||
CP_LOAD_STATE_1_STATE_TYPE(ST_CONSTANTS));
|
||||
|
|
@ -212,7 +212,7 @@ emit_textures(struct fd_ringbuffer *ring,
|
|||
for (i = 0; i < tex->num_textures; i++) {
|
||||
struct fd3_pipe_sampler_view *view =
|
||||
fd3_pipe_sampler_view(tex->textures[i]);
|
||||
OUT_RELOC(ring, view->tex_resource->bo, 0, 0);
|
||||
OUT_RELOC(ring, view->tex_resource->bo, 0, 0, 0);
|
||||
/* I think each entry is a ptr to mipmap level.. for now, just
|
||||
* pad w/ null's until I get around to actually implementing
|
||||
* mipmap support..
|
||||
|
|
@ -296,7 +296,7 @@ fd3_emit_gmem_restore_tex(struct fd_ringbuffer *ring, struct pipe_surface *psurf
|
|||
CP_LOAD_STATE_0_NUM_UNIT(1));
|
||||
OUT_RING(ring, CP_LOAD_STATE_1_STATE_TYPE(ST_CONSTANTS) |
|
||||
CP_LOAD_STATE_1_EXT_SRC_ADDR(0));
|
||||
OUT_RELOC(ring, rsc->bo, 0, 0);
|
||||
OUT_RELOC(ring, rsc->bo, 0, 0, 0);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -322,7 +322,7 @@ fd3_emit_vertex_bufs(struct fd_ringbuffer *ring,
|
|||
COND(switchnext, A3XX_VFD_FETCH_INSTR_0_SWITCHNEXT) |
|
||||
A3XX_VFD_FETCH_INSTR_0_INDEXCODE(i) |
|
||||
A3XX_VFD_FETCH_INSTR_0_STEPRATE(1));
|
||||
OUT_RELOC(ring, rsc->bo, vbufs[i].offset, 0);
|
||||
OUT_RELOC(ring, rsc->bo, vbufs[i].offset, 0, 0);
|
||||
|
||||
OUT_PKT0(ring, REG_A3XX_VFD_DECODE_INSTR(i), 1);
|
||||
OUT_RING(ring, A3XX_VFD_DECODE_INSTR_CONSTFILL |
|
||||
|
|
@ -481,12 +481,12 @@ fd3_emit_restore(struct fd_context *ctx)
|
|||
|
||||
OUT_PKT0(ring, REG_A3XX_SP_VS_PVT_MEM_CTRL_REG, 3);
|
||||
OUT_RING(ring, 0x08000001); /* SP_VS_PVT_MEM_CTRL_REG */
|
||||
OUT_RELOC(ring, fd3_ctx->vs_pvt_mem, 0, 0); /* SP_VS_PVT_MEM_ADDR_REG */
|
||||
OUT_RELOC(ring, fd3_ctx->vs_pvt_mem, 0,0,0); /* SP_VS_PVT_MEM_ADDR_REG */
|
||||
OUT_RING(ring, 0x00000000); /* SP_VS_PVT_MEM_SIZE_REG */
|
||||
|
||||
OUT_PKT0(ring, REG_A3XX_SP_FS_PVT_MEM_CTRL_REG, 3);
|
||||
OUT_RING(ring, 0x08000001); /* SP_FS_PVT_MEM_CTRL_REG */
|
||||
OUT_RELOC(ring, fd3_ctx->fs_pvt_mem, 0, 0); /* SP_FS_PVT_MEM_ADDR_REG */
|
||||
OUT_RELOC(ring, fd3_ctx->fs_pvt_mem, 0,0,0); /* SP_FS_PVT_MEM_ADDR_REG */
|
||||
OUT_RING(ring, 0x00000000); /* SP_FS_PVT_MEM_SIZE_REG */
|
||||
|
||||
OUT_PKT0(ring, REG_A3XX_PC_VERTEX_REUSE_BLOCK_CNTL, 1);
|
||||
|
|
@ -549,7 +549,7 @@ fd3_emit_restore(struct fd_context *ctx)
|
|||
OUT_RING(ring, 0x00000001); /* UCHE_CACHE_MODE_CONTROL_REG */
|
||||
|
||||
OUT_PKT0(ring, REG_A3XX_VSC_SIZE_ADDRESS, 1);
|
||||
OUT_RELOC(ring, fd3_ctx->vsc_size_mem, 0, 0); /* VSC_SIZE_ADDRESS */
|
||||
OUT_RELOC(ring, fd3_ctx->vsc_size_mem, 0, 0, 0); /* VSC_SIZE_ADDRESS */
|
||||
|
||||
OUT_PKT0(ring, REG_A3XX_GRAS_CL_CLIP_CNTL, 1);
|
||||
OUT_RING(ring, 0x00000000); /* GRAS_CL_CLIP_CNTL */
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ emit_mrt(struct fd_ringbuffer *ring, unsigned nr_bufs,
|
|||
if (bin_w || (i >= nr_bufs)) {
|
||||
OUT_RING(ring, A3XX_RB_MRT_BUF_BASE_COLOR_BUF_BASE(base));
|
||||
} else {
|
||||
OUT_RELOCS(ring, res->bo, 0, 0, -1);
|
||||
OUT_RELOCW(ring, res->bo, 0, 0, -1);
|
||||
}
|
||||
|
||||
OUT_PKT0(ring, REG_A3XX_SP_FS_IMAGE_OUTPUT_REG(i), 1);
|
||||
|
|
@ -116,7 +116,7 @@ emit_gmem2mem_surf(struct fd_ringbuffer *ring,
|
|||
OUT_RING(ring, A3XX_RB_COPY_CONTROL_MSAA_RESOLVE(MSAA_ONE) |
|
||||
A3XX_RB_COPY_CONTROL_MODE(mode) |
|
||||
A3XX_RB_COPY_CONTROL_GMEM_BASE(base));
|
||||
OUT_RELOCS(ring, rsc->bo, 0, 0, -1); /* RB_COPY_DEST_BASE */
|
||||
OUT_RELOCW(ring, rsc->bo, 0, 0, -1); /* RB_COPY_DEST_BASE */
|
||||
OUT_RING(ring, A3XX_RB_COPY_DEST_PITCH_PITCH(rsc->pitch * rsc->cpp));
|
||||
OUT_RING(ring, A3XX_RB_COPY_DEST_INFO_TILE(LINEAR) |
|
||||
A3XX_RB_COPY_DEST_INFO_FORMAT(fd3_pipe2color(psurf->format)) |
|
||||
|
|
@ -272,7 +272,7 @@ fd3_emit_tile_mem2gmem(struct fd_context *ctx, uint32_t xoff, uint32_t yoff,
|
|||
y1 = ((float)yoff + bin_h) / ((float)pfb->height);
|
||||
|
||||
OUT_PKT3(ring, CP_MEM_WRITE, 5);
|
||||
OUT_RELOC(ring, fd_resource(fd3_ctx->blit_texcoord_vbuf)->bo, 0, 0);
|
||||
OUT_RELOC(ring, fd_resource(fd3_ctx->blit_texcoord_vbuf)->bo, 0, 0, 0);
|
||||
OUT_RING(ring, fui(x0));
|
||||
OUT_RING(ring, fui(y0));
|
||||
OUT_RING(ring, fui(x1));
|
||||
|
|
@ -395,7 +395,7 @@ update_vsc_pipe(struct fd_context *ctx)
|
|||
A3XX_VSC_PIPE_CONFIG_Y(0) |
|
||||
A3XX_VSC_PIPE_CONFIG_W(gmem->nbins_x) |
|
||||
A3XX_VSC_PIPE_CONFIG_H(gmem->nbins_y));
|
||||
OUT_RELOC(ring, bo, 0, 0); /* VSC_PIPE[0].DATA_ADDRESS */
|
||||
OUT_RELOC(ring, bo, 0, 0, 0); /* VSC_PIPE[0].DATA_ADDRESS */
|
||||
OUT_RING(ring, fd_bo_size(bo) - 32); /* VSC_PIPE[0].DATA_LENGTH */
|
||||
|
||||
for (i = 1; i < 8; i++) {
|
||||
|
|
|
|||
|
|
@ -320,7 +320,7 @@ fd3_program_emit(struct fd_ringbuffer *ring,
|
|||
OUT_PKT0(ring, REG_A3XX_SP_VS_OBJ_OFFSET_REG, 2);
|
||||
OUT_RING(ring, A3XX_SP_VS_OBJ_OFFSET_REG_CONSTOBJECTOFFSET(0) |
|
||||
A3XX_SP_VS_OBJ_OFFSET_REG_SHADEROBJOFFSET(0));
|
||||
OUT_RELOC(ring, vp->bo, 0, 0); /* SP_VS_OBJ_START_REG */
|
||||
OUT_RELOC(ring, vp->bo, 0, 0, 0); /* SP_VS_OBJ_START_REG */
|
||||
#endif
|
||||
|
||||
OUT_PKT0(ring, REG_A3XX_SP_FS_LENGTH_REG, 1);
|
||||
|
|
@ -345,7 +345,7 @@ fd3_program_emit(struct fd_ringbuffer *ring,
|
|||
OUT_PKT0(ring, REG_A3XX_SP_FS_OBJ_OFFSET_REG, 2);
|
||||
OUT_RING(ring, A3XX_SP_FS_OBJ_OFFSET_REG_CONSTOBJECTOFFSET(128) |
|
||||
A3XX_SP_FS_OBJ_OFFSET_REG_SHADEROBJOFFSET(128 - fp->instrlen));
|
||||
OUT_RELOC(ring, fp->bo, 0, 0); /* SP_FS_OBJ_START_REG */
|
||||
OUT_RELOC(ring, fp->bo, 0, 0, 0); /* SP_FS_OBJ_START_REG */
|
||||
#endif
|
||||
|
||||
OUT_PKT0(ring, REG_A3XX_SP_FS_FLAT_SHAD_MODE_REG_0, 2);
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ fd_draw_emit(struct fd_context *ctx, const struct pipe_draw_info *info)
|
|||
src_sel, idx_type, IGNORE_VISIBILITY));
|
||||
OUT_RING(ring, info->count); /* NumIndices */
|
||||
if (info->indexed) {
|
||||
OUT_RELOC(ring, idx_bo, idx_offset, 0);
|
||||
OUT_RELOC(ring, idx_bo, idx_offset, 0, 0);
|
||||
OUT_RING (ring, idx_size);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -59,6 +59,9 @@ fd_resource_transfer_unmap(struct pipe_context *pctx,
|
|||
struct pipe_transfer *ptrans)
|
||||
{
|
||||
struct fd_context *ctx = fd_context(pctx);
|
||||
struct fd_resource *rsc = fd_resource(ptrans->resource);
|
||||
if (!(ptrans->usage & PIPE_TRANSFER_UNSYNCHRONIZED))
|
||||
fd_bo_cpu_fini(rsc->bo);
|
||||
pipe_resource_reference(&ptrans->resource, NULL);
|
||||
util_slab_free(&ctx->transfer_pool, ptrans);
|
||||
}
|
||||
|
|
@ -74,12 +77,13 @@ fd_resource_transfer_map(struct pipe_context *pctx,
|
|||
struct fd_resource *rsc = fd_resource(prsc);
|
||||
struct pipe_transfer *ptrans = util_slab_alloc(&ctx->transfer_pool);
|
||||
enum pipe_format format = prsc->format;
|
||||
uint32_t op = 0;
|
||||
char *buf;
|
||||
|
||||
if (!ptrans)
|
||||
return NULL;
|
||||
|
||||
/* util_slap_alloc() doesn't zero: */
|
||||
/* util_slab_alloc() doesn't zero: */
|
||||
memset(ptrans, 0, sizeof(*ptrans));
|
||||
|
||||
pipe_resource_reference(&ptrans->resource, prsc);
|
||||
|
|
@ -90,7 +94,8 @@ fd_resource_transfer_map(struct pipe_context *pctx,
|
|||
ptrans->layer_stride = ptrans->stride;
|
||||
|
||||
/* some state trackers (at least XA) don't do this.. */
|
||||
fd_resource_transfer_flush_region(pctx, ptrans, box);
|
||||
if (!(usage & PIPE_TRANSFER_FLUSH_EXPLICIT))
|
||||
fd_resource_transfer_flush_region(pctx, ptrans, box);
|
||||
|
||||
buf = fd_bo_map(rsc->bo);
|
||||
if (!buf) {
|
||||
|
|
@ -98,6 +103,15 @@ fd_resource_transfer_map(struct pipe_context *pctx,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if (usage & PIPE_TRANSFER_READ)
|
||||
op |= DRM_FREEDRENO_PREP_READ;
|
||||
|
||||
if (usage & PIPE_TRANSFER_WRITE)
|
||||
op |= DRM_FREEDRENO_PREP_WRITE;
|
||||
|
||||
if (!(usage & PIPE_TRANSFER_UNSYNCHRONIZED))
|
||||
fd_bo_cpu_prep(rsc->bo, ctx->screen->pipe, op);
|
||||
|
||||
*pptrans = ptrans;
|
||||
|
||||
return buf +
|
||||
|
|
|
|||
|
|
@ -104,25 +104,36 @@ OUT_RING(struct fd_ringbuffer *ring, uint32_t data)
|
|||
|
||||
static inline void
|
||||
OUT_RELOC(struct fd_ringbuffer *ring, struct fd_bo *bo,
|
||||
uint32_t offset, uint32_t or)
|
||||
{
|
||||
if (LOG_DWORDS) {
|
||||
DBG("ring[%p]: OUT_RELOC %04x: %p+%u", ring,
|
||||
(uint32_t)(ring->cur - ring->last_start), bo, offset);
|
||||
}
|
||||
fd_ringbuffer_emit_reloc(ring, bo, offset, or);
|
||||
}
|
||||
|
||||
/* shifted reloc: */
|
||||
static inline void
|
||||
OUT_RELOCS(struct fd_ringbuffer *ring, struct fd_bo *bo,
|
||||
uint32_t offset, uint32_t or, int32_t shift)
|
||||
{
|
||||
if (LOG_DWORDS) {
|
||||
DBG("ring[%p]: OUT_RELOCS %04x: %p+%u << %d", ring,
|
||||
DBG("ring[%p]: OUT_RELOC %04x: %p+%u << %d", ring,
|
||||
(uint32_t)(ring->cur - ring->last_start), bo, offset, shift);
|
||||
}
|
||||
fd_ringbuffer_emit_reloc_shift(ring, bo, offset, or, shift);
|
||||
fd_ringbuffer_reloc(ring, &(struct fd_reloc){
|
||||
.bo = bo,
|
||||
.flags = FD_RELOC_READ,
|
||||
.offset = offset,
|
||||
.or = or,
|
||||
.shift = shift,
|
||||
});
|
||||
}
|
||||
|
||||
static inline void
|
||||
OUT_RELOCW(struct fd_ringbuffer *ring, struct fd_bo *bo,
|
||||
uint32_t offset, uint32_t or, int32_t shift)
|
||||
{
|
||||
if (LOG_DWORDS) {
|
||||
DBG("ring[%p]: OUT_RELOC %04x: %p+%u << %d", ring,
|
||||
(uint32_t)(ring->cur - ring->last_start), bo, offset, shift);
|
||||
}
|
||||
fd_ringbuffer_reloc(ring, &(struct fd_reloc){
|
||||
.bo = bo,
|
||||
.flags = FD_RELOC_READ | FD_RELOC_WRITE,
|
||||
.offset = offset,
|
||||
.or = or,
|
||||
.shift = shift,
|
||||
});
|
||||
}
|
||||
|
||||
static inline void BEGIN_RING(struct fd_ringbuffer *ring, uint32_t ndwords)
|
||||
|
|
@ -155,7 +166,7 @@ OUT_IB(struct fd_ringbuffer *ring, struct fd_ringmarker *start,
|
|||
struct fd_ringmarker *end)
|
||||
{
|
||||
OUT_PKT3(ring, CP_INDIRECT_BUFFER_PFD, 2);
|
||||
fd_ringbuffer_emit_reloc_ring(ring, start);
|
||||
fd_ringbuffer_emit_reloc_ring(ring, start, end);
|
||||
OUT_RING(ring, fd_ringmarker_dwords(start, end));
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue