i965: Port gen6+ multisample state emitting code to genxml.
Emit 3DSTATE_MULTISAMPLE using brw_batch_emit. v3: - Remove dead code (Ken) - Simplify #if/#endif (Ken) Signed-off-by: Rafael Antognolli <rafael.antognolli@intel.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:

committed by
Kenneth Graunke

parent
158dcd8659
commit
b47b845574
@@ -1579,15 +1579,6 @@ brw_blorp_copytexsubimage(struct brw_context *brw,
|
||||
int dstX0, int dstY0,
|
||||
int width, int height);
|
||||
|
||||
/* gen6_multisample_state.c */
|
||||
unsigned
|
||||
gen6_determine_sample_mask(struct brw_context *brw);
|
||||
|
||||
void
|
||||
gen6_emit_3dstate_multisample(struct brw_context *brw,
|
||||
unsigned num_samples);
|
||||
void
|
||||
gen6_emit_3dstate_sample_mask(struct brw_context *brw, unsigned mask);
|
||||
void
|
||||
gen6_get_sample_position(struct gl_context *ctx,
|
||||
struct gl_framebuffer *fb,
|
||||
|
@@ -109,7 +109,6 @@ extern const struct brw_tracked_state gen7_cs_push_constants;
|
||||
extern const struct brw_tracked_state gen6_binding_table_pointers;
|
||||
extern const struct brw_tracked_state gen6_color_calc_state;
|
||||
extern const struct brw_tracked_state gen6_gs_binding_table;
|
||||
extern const struct brw_tracked_state gen6_multisample_state;
|
||||
extern const struct brw_tracked_state gen6_renderbuffer_surfaces;
|
||||
extern const struct brw_tracked_state gen6_sampler_state;
|
||||
extern const struct brw_tracked_state gen6_sol_surface;
|
||||
@@ -122,7 +121,6 @@ extern const struct brw_tracked_state gen7_push_constant_space;
|
||||
extern const struct brw_tracked_state gen7_urb;
|
||||
extern const struct brw_tracked_state haswell_cut_index;
|
||||
extern const struct brw_tracked_state gen8_index_buffer;
|
||||
extern const struct brw_tracked_state gen8_multisample_state;
|
||||
extern const struct brw_tracked_state gen8_pma_fix;
|
||||
extern const struct brw_tracked_state gen8_vf_topology;
|
||||
extern const struct brw_tracked_state brw_cs_work_groups_surface;
|
||||
|
@@ -118,106 +118,3 @@ gen6_set_sample_maps(struct gl_context *ctx)
|
||||
memcpy(ctx->Const.SampleMap8x, map_8x, sizeof(map_8x));
|
||||
memcpy(ctx->Const.SampleMap16x, map_16x, sizeof(map_16x));
|
||||
}
|
||||
|
||||
/**
|
||||
* 3DSTATE_MULTISAMPLE
|
||||
*/
|
||||
void
|
||||
gen6_emit_3dstate_multisample(struct brw_context *brw,
|
||||
unsigned num_samples)
|
||||
{
|
||||
uint32_t number_of_multisamples = 0;
|
||||
uint32_t sample_positions_3210 = 0;
|
||||
uint32_t sample_positions_7654 = 0;
|
||||
|
||||
assert(brw->gen < 8);
|
||||
|
||||
switch (num_samples) {
|
||||
case 0:
|
||||
case 1:
|
||||
number_of_multisamples = MS_NUMSAMPLES_1;
|
||||
break;
|
||||
case 4:
|
||||
number_of_multisamples = MS_NUMSAMPLES_4;
|
||||
sample_positions_3210 = brw_multisample_positions_4x;
|
||||
break;
|
||||
case 8:
|
||||
number_of_multisamples = MS_NUMSAMPLES_8;
|
||||
sample_positions_3210 = brw_multisample_positions_8x[0];
|
||||
sample_positions_7654 = brw_multisample_positions_8x[1];
|
||||
break;
|
||||
default:
|
||||
unreachable("Unrecognized num_samples in gen6_emit_3dstate_multisample");
|
||||
}
|
||||
|
||||
int len = brw->gen >= 7 ? 4 : 3;
|
||||
BEGIN_BATCH(len);
|
||||
OUT_BATCH(_3DSTATE_MULTISAMPLE << 16 | (len - 2));
|
||||
OUT_BATCH(MS_PIXEL_LOCATION_CENTER | number_of_multisamples);
|
||||
OUT_BATCH(sample_positions_3210);
|
||||
if (brw->gen >= 7)
|
||||
OUT_BATCH(sample_positions_7654);
|
||||
ADVANCE_BATCH();
|
||||
}
|
||||
|
||||
unsigned
|
||||
gen6_determine_sample_mask(struct brw_context *brw)
|
||||
{
|
||||
struct gl_context *ctx = &brw->ctx;
|
||||
float coverage = 1.0f;
|
||||
float coverage_invert = false;
|
||||
unsigned sample_mask = ~0u;
|
||||
|
||||
/* BRW_NEW_NUM_SAMPLES */
|
||||
unsigned num_samples = brw->num_samples;
|
||||
|
||||
if (_mesa_is_multisample_enabled(ctx)) {
|
||||
if (ctx->Multisample.SampleCoverage) {
|
||||
coverage = ctx->Multisample.SampleCoverageValue;
|
||||
coverage_invert = ctx->Multisample.SampleCoverageInvert;
|
||||
}
|
||||
if (ctx->Multisample.SampleMask) {
|
||||
sample_mask = ctx->Multisample.SampleMaskValue;
|
||||
}
|
||||
}
|
||||
|
||||
if (num_samples > 1) {
|
||||
int coverage_int = (int) (num_samples * coverage + 0.5f);
|
||||
uint32_t coverage_bits = (1 << coverage_int) - 1;
|
||||
if (coverage_invert)
|
||||
coverage_bits ^= (1 << num_samples) - 1;
|
||||
return coverage_bits & sample_mask;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 3DSTATE_SAMPLE_MASK
|
||||
*/
|
||||
void
|
||||
gen6_emit_3dstate_sample_mask(struct brw_context *brw, unsigned mask)
|
||||
{
|
||||
BEGIN_BATCH(2);
|
||||
OUT_BATCH(_3DSTATE_SAMPLE_MASK << 16 | (2 - 2));
|
||||
OUT_BATCH(mask);
|
||||
ADVANCE_BATCH();
|
||||
}
|
||||
|
||||
static void
|
||||
upload_multisample_state(struct brw_context *brw)
|
||||
{
|
||||
/* BRW_NEW_NUM_SAMPLES */
|
||||
gen6_emit_3dstate_multisample(brw, brw->num_samples);
|
||||
gen6_emit_3dstate_sample_mask(brw, gen6_determine_sample_mask(brw));
|
||||
}
|
||||
|
||||
const struct brw_tracked_state gen6_multisample_state = {
|
||||
.dirty = {
|
||||
.mesa = _NEW_MULTISAMPLE,
|
||||
.brw = BRW_NEW_BLORP |
|
||||
BRW_NEW_CONTEXT |
|
||||
BRW_NEW_NUM_SAMPLES,
|
||||
},
|
||||
.emit = upload_multisample_state
|
||||
};
|
||||
|
@@ -69,21 +69,3 @@ gen8_emit_3dstate_sample_pattern(struct brw_context *brw)
|
||||
OUT_BATCH(brw_multisample_positions_1x_2x);
|
||||
ADVANCE_BATCH();
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
upload_multisample_state(struct brw_context *brw)
|
||||
{
|
||||
gen8_emit_3dstate_multisample(brw, brw->num_samples);
|
||||
gen6_emit_3dstate_sample_mask(brw, gen6_determine_sample_mask(brw));
|
||||
}
|
||||
|
||||
const struct brw_tracked_state gen8_multisample_state = {
|
||||
.dirty = {
|
||||
.mesa = _NEW_MULTISAMPLE,
|
||||
.brw = BRW_NEW_BLORP |
|
||||
BRW_NEW_CONTEXT |
|
||||
BRW_NEW_NUM_SAMPLES,
|
||||
},
|
||||
.emit = upload_multisample_state
|
||||
};
|
||||
|
@@ -24,6 +24,7 @@
|
||||
#include <assert.h>
|
||||
|
||||
#include "common/gen_device_info.h"
|
||||
#include "common/gen_sample_positions.h"
|
||||
#include "genxml/gen_macros.h"
|
||||
|
||||
#include "main/bufferobj.h"
|
||||
@@ -36,6 +37,7 @@
|
||||
#include "brw_defines.h"
|
||||
#endif
|
||||
#include "brw_draw.h"
|
||||
#include "brw_multisample_state.h"
|
||||
#include "brw_state.h"
|
||||
#include "brw_wm.h"
|
||||
#include "brw_util.h"
|
||||
@@ -2452,6 +2454,96 @@ static const struct brw_tracked_state genX(wm_push_constants) = {
|
||||
.emit = genX(upload_wm_push_constants),
|
||||
};
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
static unsigned
|
||||
genX(determine_sample_mask)(struct brw_context *brw)
|
||||
{
|
||||
struct gl_context *ctx = &brw->ctx;
|
||||
float coverage = 1.0f;
|
||||
float coverage_invert = false;
|
||||
unsigned sample_mask = ~0u;
|
||||
|
||||
/* BRW_NEW_NUM_SAMPLES */
|
||||
unsigned num_samples = brw->num_samples;
|
||||
|
||||
if (_mesa_is_multisample_enabled(ctx)) {
|
||||
if (ctx->Multisample.SampleCoverage) {
|
||||
coverage = ctx->Multisample.SampleCoverageValue;
|
||||
coverage_invert = ctx->Multisample.SampleCoverageInvert;
|
||||
}
|
||||
if (ctx->Multisample.SampleMask) {
|
||||
sample_mask = ctx->Multisample.SampleMaskValue;
|
||||
}
|
||||
}
|
||||
|
||||
if (num_samples > 1) {
|
||||
int coverage_int = (int) (num_samples * coverage + 0.5f);
|
||||
uint32_t coverage_bits = (1 << coverage_int) - 1;
|
||||
if (coverage_invert)
|
||||
coverage_bits ^= (1 << num_samples) - 1;
|
||||
return coverage_bits & sample_mask;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
static void
|
||||
genX(emit_3dstate_multisample2)(struct brw_context *brw,
|
||||
unsigned num_samples)
|
||||
{
|
||||
assert(brw->num_samples <= 16);
|
||||
|
||||
unsigned log2_samples = ffs(MAX2(num_samples, 1)) - 1;
|
||||
|
||||
brw_batch_emit(brw, GENX(3DSTATE_MULTISAMPLE), multi) {
|
||||
multi.PixelLocation = CENTER;
|
||||
multi.NumberofMultisamples = log2_samples;
|
||||
#if GEN_GEN == 6
|
||||
GEN_SAMPLE_POS_4X(multi.Sample);
|
||||
#elif GEN_GEN == 7
|
||||
switch (num_samples) {
|
||||
case 1:
|
||||
GEN_SAMPLE_POS_1X(multi.Sample);
|
||||
break;
|
||||
case 2:
|
||||
GEN_SAMPLE_POS_2X(multi.Sample);
|
||||
break;
|
||||
case 4:
|
||||
GEN_SAMPLE_POS_4X(multi.Sample);
|
||||
break;
|
||||
case 8:
|
||||
GEN_SAMPLE_POS_8X(multi.Sample);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
genX(upload_multisample_state)(struct brw_context *brw)
|
||||
{
|
||||
genX(emit_3dstate_multisample2)(brw, brw->num_samples);
|
||||
|
||||
brw_batch_emit(brw, GENX(3DSTATE_SAMPLE_MASK), sm) {
|
||||
sm.SampleMask = genX(determine_sample_mask)(brw);
|
||||
}
|
||||
}
|
||||
|
||||
static const struct brw_tracked_state genX(multisample_state) = {
|
||||
.dirty = {
|
||||
.mesa = _NEW_MULTISAMPLE,
|
||||
.brw = BRW_NEW_BLORP |
|
||||
BRW_NEW_CONTEXT |
|
||||
BRW_NEW_NUM_SAMPLES,
|
||||
},
|
||||
.emit = genX(upload_multisample_state)
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
@@ -2913,7 +3005,7 @@ genX(upload_ps)(struct brw_context *brw)
|
||||
|
||||
/* _NEW_BUFFERS, _NEW_MULTISAMPLE */
|
||||
#if GEN_IS_HASWELL
|
||||
ps.SampleMask = gen6_determine_sample_mask(brw);
|
||||
ps.SampleMask = genX(determine_sample_mask(brw));
|
||||
#endif
|
||||
|
||||
/* 3DSTATE_PS expects the number of threads per PSD, which is always 64;
|
||||
@@ -3596,7 +3688,7 @@ genX(init_atoms)(struct brw_context *brw)
|
||||
&brw_vs_samplers,
|
||||
&brw_gs_samplers,
|
||||
&gen6_sampler_state,
|
||||
&gen6_multisample_state,
|
||||
&genX(multisample_state),
|
||||
|
||||
&genX(vs_state),
|
||||
&genX(gs_state),
|
||||
@@ -3680,7 +3772,7 @@ genX(init_atoms)(struct brw_context *brw)
|
||||
&brw_tcs_samplers,
|
||||
&brw_tes_samplers,
|
||||
&brw_gs_samplers,
|
||||
&gen6_multisample_state,
|
||||
&genX(multisample_state),
|
||||
|
||||
&genX(vs_state),
|
||||
&genX(hs_state),
|
||||
@@ -3767,7 +3859,7 @@ genX(init_atoms)(struct brw_context *brw)
|
||||
&brw_tcs_samplers,
|
||||
&brw_tes_samplers,
|
||||
&brw_gs_samplers,
|
||||
&gen8_multisample_state,
|
||||
&genX(multisample_state),
|
||||
|
||||
&genX(vs_state),
|
||||
&genX(hs_state),
|
||||
|
Reference in New Issue
Block a user