#include "brw_context.h"
#include "brw_state.h"
+#include "drivers/common/meta.h"
#include "intel_batchbuffer.h"
#include "intel_buffers.h"
static const struct brw_tracked_state *gen4_atoms[] =
{
- &brw_wm_input_sizes,
&brw_vs_prog, /* must do before GS prog, state base address. */
- &brw_gs_prog, /* must do before state base address */
+ &brw_ff_gs_prog, /* must do before state base address */
+
+ &brw_interpolation_map,
+
&brw_clip_prog, /* must do before state base address */
&brw_sf_prog, /* must do before state base address */
&brw_wm_prog, /* must do before state base address */
&brw_vs_binding_table,
&brw_wm_binding_table,
- &brw_samplers,
+ &brw_fs_samplers,
+ &brw_vs_samplers,
/* These set up state for brw_psp_urb_cbs */
&brw_wm_unit,
static const struct brw_tracked_state *gen6_atoms[] =
{
- &brw_wm_input_sizes,
&brw_vs_prog, /* must do before state base address */
- &brw_gs_prog, /* must do before state base address */
+ &brw_ff_gs_prog, /* must do before state base address */
&brw_wm_prog, /* must do before state base address */
&gen6_clip_vp,
&gen6_sf_vp,
/* Command packets: */
- &brw_invariant_state,
/* must do before binding table pointers, cc state ptrs */
&brw_state_base_address,
&gen6_blend_state, /* must do before cc unit */
&gen6_color_calc_state, /* must do before cc unit */
&gen6_depth_stencil_state, /* must do before cc unit */
- &gen6_cc_state_pointers,
&gen6_vs_push_constants, /* Before vs_state */
&gen6_wm_push_constants, /* Before wm_state */
&gen6_gs_binding_table,
&brw_wm_binding_table,
- &brw_samplers,
+ &brw_fs_samplers,
+ &brw_vs_samplers,
&gen6_sampler_state,
&gen6_multisample_state,
&brw_drawing_rect,
- &gen6_sol_indices,
&brw_indices,
&brw_index_buffer,
&brw_vertices,
static const struct brw_tracked_state *gen7_atoms[] =
{
- &brw_wm_input_sizes,
&brw_vs_prog,
+ &brw_gs_prog,
&brw_wm_prog,
/* Command packets: */
- &brw_invariant_state,
- &gen7_push_constant_alloc,
/* must do before binding table pointers, cc state ptrs */
&brw_state_base_address,
&gen7_cc_viewport_state_pointer, /* must do after brw_cc_vp */
&gen7_sf_clip_viewport,
+ &gen7_push_constant_space,
&gen7_urb,
&gen6_blend_state, /* must do before cc unit */
&gen6_color_calc_state, /* must do before cc unit */
&gen6_depth_stencil_state, /* must do before cc unit */
- &gen7_blend_state_pointer,
- &gen7_cc_state_pointer,
- &gen7_depth_stencil_state_pointer,
&gen6_vs_push_constants, /* Before vs_state */
+ &gen7_gs_push_constants, /* Before gs_state */
&gen6_wm_push_constants, /* Before wm_surfaces and constant_buffer */
/* Surface state setup. Must come before the VS/WM unit. The binding
*/
&brw_vs_pull_constants,
&brw_vs_ubo_surfaces,
+ &brw_vs_abo_surfaces,
+ &brw_gs_pull_constants,
+ &brw_gs_ubo_surfaces,
+ &brw_gs_abo_surfaces,
&brw_wm_pull_constants,
&brw_wm_ubo_surfaces,
+ &brw_wm_abo_surfaces,
&gen6_renderbuffer_surfaces,
&brw_texture_surfaces,
&brw_vs_binding_table,
+ &brw_gs_binding_table,
&brw_wm_binding_table,
- &gen7_samplers,
+ &brw_fs_samplers,
+ &brw_vs_samplers,
+ &brw_gs_samplers,
&gen6_multisample_state,
&gen7_disable_stages,
&gen7_vs_state,
+ &gen7_gs_state,
&gen7_sol_state,
&gen7_clip_state,
&gen7_sbe_state,
&haswell_cut_index,
};
+static void
+brw_upload_initial_gpu_state(struct brw_context *brw)
+{
+ /* On platforms with hardware contexts, we can set our initial GPU state
+ * right away rather than doing it via state atoms. This saves a small
+ * amount of overhead on every draw call.
+ */
+ if (!brw->hw_ctx)
+ return;
+
+ brw_upload_invariant_state(brw);
+}
void brw_init_state( struct brw_context *brw )
{
+ struct gl_context *ctx = &brw->ctx;
const struct brw_tracked_state **atoms;
int num_atoms;
brw_init_caches(brw);
- if (brw->intel.gen >= 7) {
+ if (brw->gen >= 7) {
atoms = gen7_atoms;
num_atoms = ARRAY_SIZE(gen7_atoms);
- } else if (brw->intel.gen == 6) {
+ } else if (brw->gen == 6) {
atoms = gen6_atoms;
num_atoms = ARRAY_SIZE(gen6_atoms);
} else {
assert((*atoms)->emit);
atoms++;
}
+
+ brw_upload_initial_gpu_state(brw);
+
+ brw->state.dirty.mesa = ~0;
+ brw->state.dirty.brw = ~0;
+
+ /* Make sure that brw->state.dirty.brw has enough bits to hold all possible
+ * dirty flags.
+ */
+ STATIC_ASSERT(BRW_NUM_STATE_BITS <= 8 * sizeof(brw->state.dirty.brw));
+
+ ctx->DriverFlags.NewTransformFeedback = BRW_NEW_TRANSFORM_FEEDBACK;
+ ctx->DriverFlags.NewRasterizerDiscard = BRW_NEW_RASTERIZER_DISCARD;
+ ctx->DriverFlags.NewUniformBuffer = BRW_NEW_UNIFORM_BUFFER;
+ ctx->DriverFlags.NewAtomicBuffer = BRW_NEW_ATOMIC_BUFFER;
}
/***********************************************************************
*/
-static GLuint check_state( const struct brw_state_flags *a,
- const struct brw_state_flags *b )
+static bool
+check_state(const struct brw_state_flags *a, const struct brw_state_flags *b)
{
return ((a->mesa & b->mesa) |
(a->brw & b->brw) |
DEFINE_BIT(_NEW_TEXTURE),
DEFINE_BIT(_NEW_TRANSFORM),
DEFINE_BIT(_NEW_VIEWPORT),
- DEFINE_BIT(_NEW_PACKUNPACK),
DEFINE_BIT(_NEW_ARRAY),
DEFINE_BIT(_NEW_RENDERMODE),
DEFINE_BIT(_NEW_BUFFERS),
+ DEFINE_BIT(_NEW_CURRENT_ATTRIB),
DEFINE_BIT(_NEW_MULTISAMPLE),
DEFINE_BIT(_NEW_TRACK_MATRIX),
DEFINE_BIT(_NEW_PROGRAM),
DEFINE_BIT(_NEW_PROGRAM_CONSTANTS),
+ DEFINE_BIT(_NEW_BUFFER_OBJECT),
+ DEFINE_BIT(_NEW_FRAG_CLAMP),
+ DEFINE_BIT(_NEW_VARYING_VP_INPUTS),
{0, 0, 0}
};
static struct dirty_bit_map brw_bits[] = {
DEFINE_BIT(BRW_NEW_URB_FENCE),
DEFINE_BIT(BRW_NEW_FRAGMENT_PROGRAM),
+ DEFINE_BIT(BRW_NEW_GEOMETRY_PROGRAM),
DEFINE_BIT(BRW_NEW_VERTEX_PROGRAM),
- DEFINE_BIT(BRW_NEW_INPUT_DIMENSIONS),
DEFINE_BIT(BRW_NEW_CURBE_OFFSETS),
DEFINE_BIT(BRW_NEW_REDUCED_PRIMITIVE),
DEFINE_BIT(BRW_NEW_PRIMITIVE),
DEFINE_BIT(BRW_NEW_CONTEXT),
- DEFINE_BIT(BRW_NEW_WM_INPUT_DIMENSIONS),
DEFINE_BIT(BRW_NEW_PSP),
DEFINE_BIT(BRW_NEW_SURFACES),
DEFINE_BIT(BRW_NEW_VS_BINDING_TABLE),
DEFINE_BIT(BRW_NEW_BATCH),
DEFINE_BIT(BRW_NEW_INDEX_BUFFER),
DEFINE_BIT(BRW_NEW_VS_CONSTBUF),
+ DEFINE_BIT(BRW_NEW_GS_CONSTBUF),
DEFINE_BIT(BRW_NEW_PROGRAM_CACHE),
DEFINE_BIT(BRW_NEW_STATE_BASE_ADDRESS),
+ DEFINE_BIT(BRW_NEW_VUE_MAP_VS),
+ DEFINE_BIT(BRW_NEW_VUE_MAP_GEOM_OUT),
+ DEFINE_BIT(BRW_NEW_TRANSFORM_FEEDBACK),
+ DEFINE_BIT(BRW_NEW_RASTERIZER_DISCARD),
+ DEFINE_BIT(BRW_NEW_STATS_WM),
+ DEFINE_BIT(BRW_NEW_UNIFORM_BUFFER),
+ DEFINE_BIT(BRW_NEW_ATOMIC_BUFFER),
+ DEFINE_BIT(BRW_NEW_META_IN_PROGRESS),
+ DEFINE_BIT(BRW_NEW_INTERPOLATION_MAP),
+ DEFINE_BIT(BRW_NEW_PUSH_CONSTANT_ALLOCATION),
{0, 0, 0}
};
static struct dirty_bit_map cache_bits[] = {
- DEFINE_BIT(CACHE_NEW_BLEND_STATE),
DEFINE_BIT(CACHE_NEW_CC_VP),
DEFINE_BIT(CACHE_NEW_CC_UNIT),
DEFINE_BIT(CACHE_NEW_WM_PROG),
+ DEFINE_BIT(CACHE_NEW_BLORP_BLIT_PROG),
+ DEFINE_BIT(CACHE_NEW_BLORP_CONST_COLOR_PROG),
DEFINE_BIT(CACHE_NEW_SAMPLER),
DEFINE_BIT(CACHE_NEW_WM_UNIT),
DEFINE_BIT(CACHE_NEW_SF_PROG),
DEFINE_BIT(CACHE_NEW_SF_UNIT),
DEFINE_BIT(CACHE_NEW_VS_UNIT),
DEFINE_BIT(CACHE_NEW_VS_PROG),
- DEFINE_BIT(CACHE_NEW_GS_UNIT),
+ DEFINE_BIT(CACHE_NEW_FF_GS_UNIT),
+ DEFINE_BIT(CACHE_NEW_FF_GS_PROG),
DEFINE_BIT(CACHE_NEW_GS_PROG),
DEFINE_BIT(CACHE_NEW_CLIP_VP),
DEFINE_BIT(CACHE_NEW_CLIP_UNIT),
}
static void
-brw_print_dirty_count(struct dirty_bit_map *bit_map, int32_t bits)
+brw_print_dirty_count(struct dirty_bit_map *bit_map)
{
int i;
*/
void brw_upload_state(struct brw_context *brw)
{
- struct gl_context *ctx = &brw->intel.ctx;
- struct intel_context *intel = &brw->intel;
+ struct gl_context *ctx = &brw->ctx;
struct brw_state_flags *state = &brw->state.dirty;
int i;
static int dirty_count = 0;
- state->mesa |= brw->intel.NewGLState;
- brw->intel.NewGLState = 0;
+ state->mesa |= brw->NewGLState;
+ brw->NewGLState = 0;
+
+ state->brw |= ctx->NewDriverState;
+ ctx->NewDriverState = 0;
- if (brw->emit_state_always) {
+ if (0) {
+ /* Always re-emit all state. */
state->mesa |= ~0;
state->brw |= ~0;
state->cache |= ~0;
brw->state.dirty.brw |= BRW_NEW_FRAGMENT_PROGRAM;
}
+ if (brw->geometry_program != ctx->GeometryProgram._Current) {
+ brw->geometry_program = ctx->GeometryProgram._Current;
+ brw->state.dirty.brw |= BRW_NEW_GEOMETRY_PROGRAM;
+ }
+
if (brw->vertex_program != ctx->VertexProgram._Current) {
brw->vertex_program = ctx->VertexProgram._Current;
brw->state.dirty.brw |= BRW_NEW_VERTEX_PROGRAM;
}
+ if (brw->meta_in_progress != _mesa_meta_in_progress(ctx)) {
+ brw->meta_in_progress = _mesa_meta_in_progress(ctx);
+ brw->state.dirty.brw |= BRW_NEW_META_IN_PROGRESS;
+ }
+
if ((state->mesa | state->cache | state->brw) == 0)
return;
- intel_check_front_buffer_rendering(intel);
+ intel_check_front_buffer_rendering(brw);
if (unlikely(INTEL_DEBUG)) {
/* Debug version which enforces various sanity checks on the
}
if (unlikely(INTEL_DEBUG & DEBUG_STATE)) {
+ STATIC_ASSERT(ARRAY_SIZE(brw_bits) == BRW_NUM_STATE_BITS + 1);
+ STATIC_ASSERT(ARRAY_SIZE(cache_bits) == BRW_MAX_CACHE + 1);
+
brw_update_dirty_count(mesa_bits, state->mesa);
brw_update_dirty_count(brw_bits, state->brw);
brw_update_dirty_count(cache_bits, state->cache);
if (dirty_count++ % 1000 == 0) {
- brw_print_dirty_count(mesa_bits, state->mesa);
- brw_print_dirty_count(brw_bits, state->brw);
- brw_print_dirty_count(cache_bits, state->cache);
+ brw_print_dirty_count(mesa_bits);
+ brw_print_dirty_count(brw_bits);
+ brw_print_dirty_count(cache_bits);
fprintf(stderr, "\n");
}
}