intel/blorp: Add a blorp_emit_dynamic macro

This makes it much easier to throw together a bit of dynamic state.  It
also automatically handles flushing so you don't accidentally forget.

Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com>
This commit is contained in:
Jason Ekstrand 2016-09-10 14:15:51 -07:00
parent 1832ef6cd9
commit 4495b917e2
1 changed files with 51 additions and 65 deletions

View File

@ -120,6 +120,18 @@ _blorp_combine_address(struct blorp_batch *batch, void *location,
_dw ? _dw + 1 : NULL; /* Array starts at dw[1] */ \
})
#define STRUCT_ZERO(S) ({ struct S t; memset(&t, 0, sizeof(t)); t; })
#define blorp_emit_dynamic(batch, state, name, align, offset) \
for (struct state name = STRUCT_ZERO(state), \
*_dst = blorp_alloc_dynamic_state(batch, \
_blorp_cmd_length(state) * 4, \
align, offset); \
__builtin_expect(_dst != NULL, 1); \
_blorp_cmd_pack(state)(batch, (void *)_dst, &name), \
blorp_flush_range(batch, _dst, _blorp_cmd_length(state) * 4), \
_dst = NULL)
/* 3DSTATE_URB
* 3DSTATE_URB_VS
* 3DSTATE_URB_HS
@ -846,26 +858,19 @@ static uint32_t
blorp_emit_blend_state(struct blorp_batch *batch,
const struct blorp_params *params)
{
struct GENX(BLEND_STATE) blend;
memset(&blend, 0, sizeof(blend));
for (unsigned i = 0; i < params->num_draw_buffers; ++i) {
blend.Entry[i].PreBlendColorClampEnable = true;
blend.Entry[i].PostBlendColorClampEnable = true;
blend.Entry[i].ColorClampRange = COLORCLAMP_RTFORMAT;
blend.Entry[i].WriteDisableRed = params->color_write_disable[0];
blend.Entry[i].WriteDisableGreen = params->color_write_disable[1];
blend.Entry[i].WriteDisableBlue = params->color_write_disable[2];
blend.Entry[i].WriteDisableAlpha = params->color_write_disable[3];
}
uint32_t offset;
void *state = blorp_alloc_dynamic_state(batch,
GENX(BLEND_STATE_length) * 4,
64, &offset);
GENX(BLEND_STATE_pack)(NULL, state, &blend);
blorp_flush_range(batch, state, GENX(BLEND_STATE_length) * 4);
blorp_emit_dynamic(batch, GENX(BLEND_STATE), blend, 64, &offset) {
for (unsigned i = 0; i < params->num_draw_buffers; ++i) {
blend.Entry[i].PreBlendColorClampEnable = true;
blend.Entry[i].PostBlendColorClampEnable = true;
blend.Entry[i].ColorClampRange = COLORCLAMP_RTFORMAT;
blend.Entry[i].WriteDisableRed = params->color_write_disable[0];
blend.Entry[i].WriteDisableGreen = params->color_write_disable[1];
blend.Entry[i].WriteDisableBlue = params->color_write_disable[2];
blend.Entry[i].WriteDisableAlpha = params->color_write_disable[3];
}
}
#if GEN_GEN >= 7
blorp_emit(batch, GENX(3DSTATE_BLEND_STATE_POINTERS), sp) {
@ -889,18 +894,12 @@ static uint32_t
blorp_emit_color_calc_state(struct blorp_batch *batch,
const struct blorp_params *params)
{
struct GENX(COLOR_CALC_STATE) cc = { 0 };
#if GEN_GEN <= 8
cc.StencilReferenceValue = params->stencil_ref;
#endif
uint32_t offset;
void *state = blorp_alloc_dynamic_state(batch,
GENX(COLOR_CALC_STATE_length) * 4,
64, &offset);
GENX(COLOR_CALC_STATE_pack)(NULL, state, &cc);
blorp_flush_range(batch, state, GENX(COLOR_CALC_STATE_length) * 4);
blorp_emit_dynamic(batch, GENX(COLOR_CALC_STATE), cc, 64, &offset) {
#if GEN_GEN <= 8
cc.StencilReferenceValue = params->stencil_ref;
#endif
}
#if GEN_GEN >= 7
blorp_emit(batch, GENX(3DSTATE_CC_STATE_POINTERS), sp) {
@ -1126,31 +1125,25 @@ static void
blorp_emit_sampler_state(struct blorp_batch *batch,
const struct blorp_params *params)
{
struct GENX(SAMPLER_STATE) sampler = {
.MipModeFilter = MIPFILTER_NONE,
.MagModeFilter = MAPFILTER_LINEAR,
.MinModeFilter = MAPFILTER_LINEAR,
.MinLOD = 0,
.MaxLOD = 0,
.TCXAddressControlMode = TCM_CLAMP,
.TCYAddressControlMode = TCM_CLAMP,
.TCZAddressControlMode = TCM_CLAMP,
.MaximumAnisotropy = RATIO21,
.RAddressMinFilterRoundingEnable = true,
.RAddressMagFilterRoundingEnable = true,
.VAddressMinFilterRoundingEnable = true,
.VAddressMagFilterRoundingEnable = true,
.UAddressMinFilterRoundingEnable = true,
.UAddressMagFilterRoundingEnable = true,
.NonnormalizedCoordinateEnable = true,
};
uint32_t offset;
void *state = blorp_alloc_dynamic_state(batch,
GENX(SAMPLER_STATE_length) * 4,
32, &offset);
GENX(SAMPLER_STATE_pack)(NULL, state, &sampler);
blorp_flush_range(batch, state, GENX(SAMPLER_STATE_length) * 4);
blorp_emit_dynamic(batch, GENX(SAMPLER_STATE), sampler, 32, &offset) {
sampler.MipModeFilter = MIPFILTER_NONE;
sampler.MagModeFilter = MAPFILTER_LINEAR;
sampler.MinModeFilter = MAPFILTER_LINEAR;
sampler.MinLOD = 0;
sampler.MaxLOD = 0;
sampler.TCXAddressControlMode = TCM_CLAMP;
sampler.TCYAddressControlMode = TCM_CLAMP;
sampler.TCZAddressControlMode = TCM_CLAMP;
sampler.MaximumAnisotropy = RATIO21;
sampler.RAddressMinFilterRoundingEnable = true;
sampler.RAddressMagFilterRoundingEnable = true;
sampler.VAddressMinFilterRoundingEnable = true;
sampler.VAddressMagFilterRoundingEnable = true;
sampler.UAddressMinFilterRoundingEnable = true;
sampler.UAddressMagFilterRoundingEnable = true;
sampler.NonnormalizedCoordinateEnable = true;
}
#if GEN_GEN >= 7
blorp_emit(batch, GENX(3DSTATE_SAMPLER_STATE_POINTERS_PS), ssp) {
@ -1293,17 +1286,10 @@ blorp_emit_viewport_state(struct blorp_batch *batch,
const struct blorp_params *params)
{
uint32_t cc_vp_offset;
void *state = blorp_alloc_dynamic_state(batch,
GENX(CC_VIEWPORT_length) * 4, 32,
&cc_vp_offset);
GENX(CC_VIEWPORT_pack)(batch, state,
&(struct GENX(CC_VIEWPORT)) {
.MinimumDepth = 0.0,
.MaximumDepth = 1.0,
});
blorp_flush_range(batch, state, GENX(CC_VIEWPORT_length) * 4);
blorp_emit_dynamic(batch, GENX(CC_VIEWPORT), vp, 32, &cc_vp_offset) {
vp.MinimumDepth = 0.0;
vp.MaximumDepth = 1.0;
}
#if GEN_GEN >= 7
blorp_emit(batch, GENX(3DSTATE_VIEWPORT_STATE_POINTERS_CC), vsp) {