Signed-off-by: Jerome Glisse <jglisse@redhat.com>tags/snb-magic
@@ -39,9 +39,6 @@ | |||
#include <pipebuffer/pb_bufmgr.h> | |||
#include "r600_priv.h" | |||
struct radeon_bo *r600_context_reg_bo(struct r600_context *ctx, unsigned offset); | |||
int r600_context_add_block(struct r600_context *ctx, const struct r600_reg *reg, unsigned nreg); | |||
#define GROUP_FORCE_NEW_BLOCK 0 | |||
static const struct r600_reg evergreen_config_reg_list[] = { | |||
@@ -747,8 +744,8 @@ void evergreen_context_pipe_state_set_vs_sampler(struct r600_context *ctx, struc | |||
void evergreen_context_draw(struct r600_context *ctx, const struct r600_draw *draw) | |||
{ | |||
struct radeon_bo *cb[12]; | |||
struct radeon_bo *db; | |||
struct r600_bo *cb[12]; | |||
struct r600_bo *db; | |||
unsigned ndwords = 9; | |||
if (draw->indices) { | |||
@@ -823,7 +820,7 @@ void evergreen_context_draw(struct r600_context *ctx, const struct r600_draw *dr | |||
ctx->pm4[ctx->pm4_cdwords++] = draw->vgt_draw_initiator; | |||
ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_NOP, 0); | |||
ctx->pm4[ctx->pm4_cdwords++] = 0; | |||
r600_context_bo_reloc(ctx, &ctx->pm4[ctx->pm4_cdwords - 1], radeon_bo_pb_get_bo(draw->indices->pb)); | |||
r600_context_bo_reloc(ctx, &ctx->pm4[ctx->pm4_cdwords - 1], draw->indices); | |||
} else { | |||
ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_DRAW_INDEX_AUTO, 1); | |||
ctx->pm4[ctx->pm4_cdwords++] = draw->vgt_num_indices; |
@@ -705,10 +705,12 @@ out_err: | |||
return r; | |||
} | |||
void r600_context_bo_reloc(struct r600_context *ctx, u32 *pm4, struct radeon_bo *bo) | |||
void r600_context_bo_reloc(struct r600_context *ctx, u32 *pm4, struct r600_bo *rbo) | |||
{ | |||
struct radeon_bo *bo; | |||
int i, reloc_id; | |||
bo = r600_bo_get_bo(rbo); | |||
assert(bo != NULL); | |||
for (i = 0, reloc_id = -1; i < ctx->creloc; i++) { | |||
if (ctx->reloc[i].handle == bo->handle) { | |||
@@ -881,7 +883,7 @@ void r600_context_pipe_state_set_vs_sampler(struct r600_context *ctx, struct r60 | |||
r600_context_pipe_state_set_sampler_border(ctx, state, offset); | |||
} | |||
struct radeon_bo *r600_context_reg_bo(struct r600_context *ctx, unsigned offset) | |||
struct r600_bo *r600_context_reg_bo(struct r600_context *ctx, unsigned offset) | |||
{ | |||
struct r600_range *range; | |||
struct r600_block *block; | |||
@@ -892,15 +894,15 @@ struct radeon_bo *r600_context_reg_bo(struct r600_context *ctx, unsigned offset) | |||
offset -= block->start_offset; | |||
id = block->pm4_bo_index[offset >> 2]; | |||
if (block->reloc[id].bo) { | |||
return radeon_bo_pb_get_bo(block->reloc[id].bo->pb); | |||
return block->reloc[id].bo; | |||
} | |||
return NULL; | |||
} | |||
void r600_context_draw(struct r600_context *ctx, const struct r600_draw *draw) | |||
{ | |||
struct radeon_bo *cb[8]; | |||
struct radeon_bo *db; | |||
struct r600_bo *cb[8]; | |||
struct r600_bo *db; | |||
unsigned ndwords = 9; | |||
if (draw->indices) { | |||
@@ -973,7 +975,7 @@ void r600_context_draw(struct r600_context *ctx, const struct r600_draw *draw) | |||
ctx->pm4[ctx->pm4_cdwords++] = draw->vgt_draw_initiator; | |||
ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_NOP, 0); | |||
ctx->pm4[ctx->pm4_cdwords++] = 0; | |||
r600_context_bo_reloc(ctx, &ctx->pm4[ctx->pm4_cdwords - 1], radeon_bo_pb_get_bo(draw->indices->pb)); | |||
r600_context_bo_reloc(ctx, &ctx->pm4[ctx->pm4_cdwords - 1], draw->indices); | |||
} else { | |||
ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_DRAW_INDEX_AUTO, 1); | |||
ctx->pm4[ctx->pm4_cdwords++] = draw->vgt_num_indices; | |||
@@ -1184,7 +1186,7 @@ void r600_query_begin(struct r600_context *ctx, struct r600_query *query) | |||
ctx->pm4[ctx->pm4_cdwords++] = 0; | |||
ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_NOP, 0); | |||
ctx->pm4[ctx->pm4_cdwords++] = 0; | |||
r600_context_bo_reloc(ctx, &ctx->pm4[ctx->pm4_cdwords - 1], radeon_bo_pb_get_bo(query->buffer->pb)); | |||
r600_context_bo_reloc(ctx, &ctx->pm4[ctx->pm4_cdwords - 1], query->buffer); | |||
query->state |= R600_QUERY_STATE_STARTED; | |||
query->state ^= R600_QUERY_STATE_ENDED; | |||
@@ -1200,7 +1202,7 @@ void r600_query_end(struct r600_context *ctx, struct r600_query *query) | |||
ctx->pm4[ctx->pm4_cdwords++] = 0; | |||
ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_NOP, 0); | |||
ctx->pm4[ctx->pm4_cdwords++] = 0; | |||
r600_context_bo_reloc(ctx, &ctx->pm4[ctx->pm4_cdwords - 1], radeon_bo_pb_get_bo(query->buffer->pb)); | |||
r600_context_bo_reloc(ctx, &ctx->pm4[ctx->pm4_cdwords - 1], query->buffer); | |||
query->num_results += 16; | |||
query->state ^= R600_QUERY_STATE_STARTED; |
@@ -68,6 +68,7 @@ struct radeon_bo { | |||
struct r600_bo { | |||
struct pipe_reference reference; | |||
struct pb_buffer *pb; | |||
unsigned size; | |||
}; | |||
@@ -78,8 +79,6 @@ unsigned radeon_family_from_device(unsigned device); | |||
struct radeon *radeon_decref(struct radeon *radeon); | |||
/* radeon_bo.c */ | |||
struct radeon_bo *radeon_bo_pb_get_bo(struct pb_buffer *_buf); | |||
void r600_context_bo_reloc(struct r600_context *ctx, u32 *pm4, struct radeon_bo *bo); | |||
struct radeon_bo *radeon_bo(struct radeon *radeon, unsigned handle, | |||
unsigned size, unsigned alignment, void *ptr); | |||
void radeon_bo_reference(struct radeon *radeon, struct radeon_bo **dst, | |||
@@ -89,13 +88,23 @@ int radeon_bo_busy(struct radeon *radeon, struct radeon_bo *bo, uint32_t *domain | |||
void radeon_bo_pbmgr_flush_maps(struct pb_manager *_mgr); | |||
/* radeon_bo_pb.c */ | |||
struct radeon_bo *radeon_bo_pb_get_bo(struct pb_buffer *_buf); | |||
struct pb_manager *radeon_bo_pbmgr_create(struct radeon *radeon); | |||
struct pb_buffer *radeon_bo_pb_create_buffer_from_handle(struct pb_manager *_mgr, | |||
uint32_t handle); | |||
/* r600_hw_context.c */ | |||
void r600_context_bo_reloc(struct r600_context *ctx, u32 *pm4, struct r600_bo *rbo); | |||
struct r600_bo *r600_context_reg_bo(struct r600_context *ctx, unsigned offset); | |||
int r600_context_add_block(struct r600_context *ctx, const struct r600_reg *reg, unsigned nreg); | |||
/* r600_bo.c */ | |||
unsigned r600_bo_get_handle(struct r600_bo *bo); | |||
unsigned r600_bo_get_size(struct r600_bo *bo); | |||
static INLINE struct radeon_bo *r600_bo_get_bo(struct r600_bo *bo) | |||
{ | |||
return radeon_bo_pb_get_bo(bo->pb); | |||
} | |||
#define CTX_RANGE_ID(ctx, offset) (((offset) >> (ctx)->hash_shift) & 255) | |||
#define CTX_BLOCK_ID(ctx, offset) ((offset) & ((1 << (ctx)->hash_shift) - 1)) | |||
@@ -122,18 +131,16 @@ static void inline r600_context_reg(struct r600_context *ctx, | |||
static inline void r600_context_block_emit_dirty(struct r600_context *ctx, struct r600_block *block) | |||
{ | |||
struct radeon_bo *bo; | |||
int id; | |||
for (int j = 0; j < block->nreg; j++) { | |||
if (block->pm4_bo_index[j]) { | |||
/* find relocation */ | |||
id = block->pm4_bo_index[j]; | |||
bo = radeon_bo_pb_get_bo(block->reloc[id].bo->pb); | |||
for (int k = 0; k < block->reloc[id].nreloc; k++) { | |||
r600_context_bo_reloc(ctx, | |||
&block->pm4[block->reloc[id].bo_pm4_index[k]], | |||
bo); | |||
block->reloc[id].bo); | |||
} | |||
} | |||
} |
@@ -37,6 +37,7 @@ struct r600_bo *r600_bo(struct radeon *radeon, | |||
desc.alignment = alignment; | |||
desc.usage = usage; | |||
ws_bo->size = size; | |||
if (!radeon->use_mem_constant && (usage & PIPE_BIND_CONSTANT_BUFFER)) { | |||
man = radeon->mman; | |||
@@ -59,12 +60,15 @@ struct r600_bo *r600_bo_handle(struct radeon *radeon, | |||
unsigned handle) | |||
{ | |||
struct r600_bo *ws_bo = calloc(1, sizeof(struct r600_bo)); | |||
struct radeon_bo *bo; | |||
ws_bo->pb = radeon_bo_pb_create_buffer_from_handle(radeon->kman, handle); | |||
if (!ws_bo->pb) { | |||
free(ws_bo); | |||
return NULL; | |||
} | |||
bo = radeon_bo_pb_get_bo(ws_bo->pb); | |||
ws_bo->size = bo->size; | |||
pipe_reference_init(&ws_bo->reference, 1); | |||
return ws_bo; | |||
} |