ilo: update multisample related states for Gen8

This commit is contained in:
Chia-I Wu
2015-01-26 13:34:51 +08:00
parent 6366fbc1a8
commit 9aeee99e4d
3 changed files with 116 additions and 1 deletions
@@ -770,6 +770,75 @@ gen6_3DSTATE_MULTISAMPLE(struct ilo_builder *builder,
dw[3] = dw3;
}
static inline void
gen8_3DSTATE_MULTISAMPLE(struct ilo_builder *builder,
int num_samples,
bool pixel_location_center)
{
const uint8_t cmd_len = 2;
uint32_t dw1, *dw;
ILO_DEV_ASSERT(builder->dev, 8, 8);
dw1 = (pixel_location_center) ? GEN6_MULTISAMPLE_DW1_PIXLOC_CENTER :
GEN6_MULTISAMPLE_DW1_PIXLOC_UL_CORNER;
switch (num_samples) {
case 0:
case 1:
dw1 |= GEN6_MULTISAMPLE_DW1_NUMSAMPLES_1;
break;
case 2:
dw1 |= GEN8_MULTISAMPLE_DW1_NUMSAMPLES_2;
break;
case 4:
dw1 |= GEN6_MULTISAMPLE_DW1_NUMSAMPLES_4;
break;
case 8:
dw1 |= GEN7_MULTISAMPLE_DW1_NUMSAMPLES_8;
break;
case 16:
dw1 |= GEN8_MULTISAMPLE_DW1_NUMSAMPLES_16;
break;
default:
assert(!"unsupported sample count");
dw1 |= GEN6_MULTISAMPLE_DW1_NUMSAMPLES_1;
break;
}
ilo_builder_batch_pointer(builder, cmd_len, &dw);
dw[0] = GEN8_RENDER_CMD(3D, 3DSTATE_MULTISAMPLE) | (cmd_len - 2);
dw[1] = dw1;
}
static inline void
gen8_3DSTATE_SAMPLE_PATTERN(struct ilo_builder *builder,
const uint32_t *pattern_1x,
const uint32_t *pattern_2x,
const uint32_t *pattern_4x,
const uint32_t *pattern_8x,
const uint32_t *pattern_16x)
{
const uint8_t cmd_len = 9;
uint32_t *dw;
ILO_DEV_ASSERT(builder->dev, 8, 8);
ilo_builder_batch_pointer(builder, cmd_len, &dw);
dw[0] = GEN8_RENDER_CMD(3D, 3DSTATE_SAMPLE_PATTERN) | (cmd_len - 2);
dw[1] = pattern_16x[3];
dw[2] = pattern_16x[2];
dw[3] = pattern_16x[1];
dw[4] = pattern_16x[0];
dw[5] = pattern_8x[1];
dw[6] = pattern_8x[0];
dw[7] = pattern_4x[0];
dw[8] = pattern_1x[0] << 16 |
pattern_2x[0];
}
static inline void
gen6_3DSTATE_SAMPLE_MASK(struct ilo_builder *builder,
unsigned sample_mask)
@@ -797,7 +866,7 @@ gen7_3DSTATE_SAMPLE_MASK(struct ilo_builder *builder,
const unsigned valid_mask = ((1 << num_samples) - 1) | 0x1;
uint32_t *dw;
ILO_DEV_ASSERT(builder->dev, 7, 7.5);
ILO_DEV_ASSERT(builder->dev, 7, 8);
/*
* From the Ivy Bridge PRM, volume 2 part 1, page 294:
+44
View File
@@ -44,6 +44,11 @@ static const struct sample_position ilo_sample_pattern_1x[1] = {
{ 0, 0 },
};
static const struct sample_position ilo_sample_pattern_2x[2] = {
{ -4, -4 },
{ 4, 4 },
};
static const struct sample_position ilo_sample_pattern_4x[4] = {
{ -2, -6 },
{ 6, -2 },
@@ -63,6 +68,25 @@ static const struct sample_position ilo_sample_pattern_8x[8] = {
{ -5, 7 },
};
static const struct sample_position ilo_sample_pattern_16x[16] = {
{ 0, 2 },
{ 3, 0 },
{ -3, -2 },
{ -2, -4 },
{ 4, 3 },
{ 5, 1 },
{ 6, -1 },
{ 2, -6 },
{ -4, 5 },
{ -5, -5 },
{ -1, -7 },
{ 7, -3 },
{ -7, 4 },
{ 1, -8 },
{ -6, 6 },
{ -8, 7 },
};
static uint8_t
pack_sample_position(const struct sample_position *pos)
{
@@ -99,6 +123,9 @@ ilo_render_create(struct ilo_builder *builder)
/* pack into dwords */
render->sample_pattern_1x = pack_sample_position(ilo_sample_pattern_1x);
render->sample_pattern_2x =
pack_sample_position(&ilo_sample_pattern_2x[1]) << 8 |
pack_sample_position(&ilo_sample_pattern_2x[0]);
for (i = 0; i < 4; i++) {
render->sample_pattern_4x |=
pack_sample_position(&ilo_sample_pattern_4x[i]) << (8 * i);
@@ -107,6 +134,15 @@ ilo_render_create(struct ilo_builder *builder)
pack_sample_position(&ilo_sample_pattern_8x[i]) << (8 * i);
render->sample_pattern_8x[1] |=
pack_sample_position(&ilo_sample_pattern_8x[i + 4]) << (8 * i);
render->sample_pattern_16x[0] |=
pack_sample_position(&ilo_sample_pattern_16x[i]) << (8 * i);
render->sample_pattern_16x[1] |=
pack_sample_position(&ilo_sample_pattern_16x[i + 4]) << (8 * i);
render->sample_pattern_16x[2] |=
pack_sample_position(&ilo_sample_pattern_16x[i + 8]) << (8 * i);
render->sample_pattern_16x[3] |=
pack_sample_position(&ilo_sample_pattern_16x[i + 12]) << (8 * i);
}
ilo_render_invalidate_hw(render);
@@ -137,6 +173,10 @@ ilo_render_get_sample_position(const struct ilo_render *render,
assert(sample_index < Elements(ilo_sample_pattern_1x));
pattern = ilo_sample_pattern_1x;
break;
case 2:
assert(sample_index < Elements(ilo_sample_pattern_2x));
pattern = ilo_sample_pattern_2x;
break;
case 4:
assert(sample_index < Elements(ilo_sample_pattern_4x));
pattern = ilo_sample_pattern_4x;
@@ -145,6 +185,10 @@ ilo_render_get_sample_position(const struct ilo_render *render,
assert(sample_index < Elements(ilo_sample_pattern_8x));
pattern = ilo_sample_pattern_8x;
break;
case 16:
assert(sample_index < Elements(ilo_sample_pattern_16x));
pattern = ilo_sample_pattern_16x;
break;
default:
assert(!"unknown sample count");
*x = 0.5f;
+2
View File
@@ -48,8 +48,10 @@ struct ilo_render {
struct intel_bo *workaround_bo;
uint32_t sample_pattern_1x;
uint32_t sample_pattern_2x;
uint32_t sample_pattern_4x;
uint32_t sample_pattern_8x[2];
uint32_t sample_pattern_16x[4];
bool hw_ctx_changed;