ilo: clean up SURFACE_STATE and BINDING_TABLE_STATE

Add ilo_builder_surface_pointer() to replace ilo_builder_surface_write().
Make Gen8+ take a different path in gen6_SURFACE_STATE().
This commit is contained in:
Chia-I Wu
2015-03-06 04:27:16 +08:00
parent 8b2c845ea0
commit e7c74ef43d
2 changed files with 35 additions and 21 deletions

View File

@@ -350,21 +350,22 @@ ilo_builder_dynamic_used(const struct ilo_builder *builder)
} }
/** /**
* Write a surface state to the surface buffer. The offset, in bytes, of the * Reserve a region from the surface buffer. Both the offset, in bytes, and
* state is returned. * the pointer to the reserved region are returned. The pointer is only valid
* until the next reserve call.
* *
* Note that \p alignment is in bytes and \p len is in DWords. * Note that \p alignment is in bytes and \p len is in DWords.
*/ */
static inline uint32_t static inline uint32_t
ilo_builder_surface_write(struct ilo_builder *builder, ilo_builder_surface_pointer(struct ilo_builder *builder,
enum ilo_builder_item_type item, enum ilo_builder_item_type item,
unsigned alignment, unsigned len, unsigned alignment, unsigned len,
const uint32_t *dw) uint32_t **dw)
{ {
assert(item == ILO_BUILDER_ITEM_SURFACE || assert(item == ILO_BUILDER_ITEM_SURFACE ||
item == ILO_BUILDER_ITEM_BINDING_TABLE); item == ILO_BUILDER_ITEM_BINDING_TABLE);
return ilo_builder_dynamic_write(builder, item, alignment, len, dw); return ilo_builder_dynamic_pointer(builder, item, alignment, len, dw);
} }
/** /**

View File

@@ -1585,11 +1585,12 @@ gen7_3DSTATE_CONSTANT_GS(struct ilo_builder *builder,
static inline uint32_t static inline uint32_t
gen6_BINDING_TABLE_STATE(struct ilo_builder *builder, gen6_BINDING_TABLE_STATE(struct ilo_builder *builder,
uint32_t *surface_states, const uint32_t *surface_states,
int num_surface_states) int num_surface_states)
{ {
const int state_align = 32; const int state_align = 32;
const int state_len = num_surface_states; const int state_len = num_surface_states;
uint32_t state_offset, *dw;
ILO_DEV_ASSERT(builder->dev, 6, 8); ILO_DEV_ASSERT(builder->dev, 6, 8);
@@ -1603,8 +1604,11 @@ gen6_BINDING_TABLE_STATE(struct ilo_builder *builder,
if (!num_surface_states) if (!num_surface_states)
return 0; return 0;
return ilo_builder_surface_write(builder, ILO_BUILDER_ITEM_BINDING_TABLE, state_offset = ilo_builder_surface_pointer(builder,
state_align, state_len, surface_states); ILO_BUILDER_ITEM_BINDING_TABLE, state_align, state_len, &dw);
memcpy(dw, surface_states, state_len << 2);
return state_offset;
} }
static inline uint32_t static inline uint32_t
@@ -1612,23 +1616,32 @@ gen6_SURFACE_STATE(struct ilo_builder *builder,
const struct ilo_view_surface *surf, const struct ilo_view_surface *surf,
bool for_render) bool for_render)
{ {
const int state_align = int state_align, state_len;
(ilo_dev_gen(builder->dev) >= ILO_GEN(8)) ? 64 : 32; uint32_t state_offset, *dw;
const int state_len =
(ilo_dev_gen(builder->dev) >= ILO_GEN(8)) ? 13 :
(ilo_dev_gen(builder->dev) >= ILO_GEN(7)) ? 8 : 6;
uint32_t state_offset;
ILO_DEV_ASSERT(builder->dev, 6, 8); ILO_DEV_ASSERT(builder->dev, 6, 8);
state_offset = ilo_builder_surface_write(builder, ILO_BUILDER_ITEM_SURFACE, if (ilo_dev_gen(builder->dev) >= ILO_GEN(8)) {
state_align, state_len, surf->payload); state_align = 64;
state_len = 13;
if (surf->bo) { state_offset = ilo_builder_surface_pointer(builder,
if (ilo_dev_gen(builder->dev) >= ILO_GEN(8)) { ILO_BUILDER_ITEM_SURFACE, state_align, state_len, &dw);
memcpy(dw, surf->payload, state_len << 2);
if (surf->bo) {
ilo_builder_surface_reloc64(builder, state_offset, 8, surf->bo, ilo_builder_surface_reloc64(builder, state_offset, 8, surf->bo,
surf->payload[8], (for_render) ? INTEL_RELOC_WRITE : 0); surf->payload[8], (for_render) ? INTEL_RELOC_WRITE : 0);
} else { }
} else {
state_align = 32;
state_len = (ilo_dev_gen(builder->dev) >= ILO_GEN(7)) ? 8 : 6;
state_offset = ilo_builder_surface_pointer(builder,
ILO_BUILDER_ITEM_SURFACE, state_align, state_len, &dw);
memcpy(dw, surf->payload, state_len << 2);
if (surf->bo) {
ilo_builder_surface_reloc(builder, state_offset, 1, surf->bo, ilo_builder_surface_reloc(builder, state_offset, 1, surf->bo,
surf->payload[1], (for_render) ? INTEL_RELOC_WRITE : 0); surf->payload[1], (for_render) ? INTEL_RELOC_WRITE : 0);
} }