#include <stdbool.h>
#include "main/macros.h"
#include "main/mtypes.h"
+#include "main/errors.h"
#include "brw_structs.h"
#include "brw_pipe_control.h"
#include "compiler/brw_compiler.h"
#include <brw_bufmgr.h>
#include "common/gen_debug.h"
+#include "common/gen_decoder.h"
#include "intel_screen.h"
#include "intel_tex_obj.h"
GLuint step_rate;
};
struct brw_vertex_element {
- const struct gl_vertex_array *glarray;
+ const struct gl_array_attributes *glattrib;
+ const struct gl_vertex_buffer_binding *glbinding;
int buffer;
bool is_dual_slot;
struct brw_growing_bo {
struct brw_bo *bo;
uint32_t *map;
- uint32_t *cpu_map;
+ struct brw_bo *partial_bo;
+ uint32_t *partial_bo_map;
+ unsigned partial_bytes;
};
struct intel_batchbuffer {
uint32_t state_used;
enum brw_gpu_ring ring;
+ bool use_shadow_copy;
bool use_batch_first;
bool needs_sol_reset;
bool state_base_address_emitted;
/** Map from batch offset to brw_state_batch data (with DEBUG_BATCH) */
struct hash_table *state_batch_sizes;
+
+ struct gen_batch_decode_ctx decoder;
};
#define BRW_MAX_XFB_STREAMS 4
+struct brw_transform_feedback_counter {
+ /**
+ * Index of the first entry of this counter within the primitive count BO.
+ * An entry is considered to be an N-tuple of 64bit values, where N is the
+ * number of vertex streams supported by the platform.
+ */
+ unsigned bo_start;
+
+ /**
+ * Index one past the last entry of this counter within the primitive
+ * count BO.
+ */
+ unsigned bo_end;
+
+ /**
+ * Primitive count values accumulated while this counter was active,
+ * excluding any entries buffered between \c bo_start and \c bo_end, which
+ * haven't been accounted for yet.
+ */
+ uint64_t accum[BRW_MAX_XFB_STREAMS];
+};
+
+static inline void
+brw_reset_transform_feedback_counter(
+ struct brw_transform_feedback_counter *counter)
+{
+ counter->bo_start = counter->bo_end;
+ memset(&counter->accum, 0, sizeof(counter->accum));
+}
+
struct brw_transform_feedback_object {
struct gl_transform_feedback_object base;
*/
unsigned max_index;
+ struct brw_bo *prim_count_bo;
+
/**
* Count of primitives generated during this transform feedback operation.
- * @{
*/
- uint64_t prims_generated[BRW_MAX_XFB_STREAMS];
- struct brw_bo *prim_count_bo;
- unsigned prim_count_buffer_index; /**< in number of uint64_t units */
- /** @} */
+ struct brw_transform_feedback_counter counter;
+
+ /**
+ * Count of primitives generated during the previous transform feedback
+ * operation. Used to implement DrawTransformFeedback().
+ */
+ struct brw_transform_feedback_counter previous_counter;
/**
* Number of vertices written between last Begin/EndTransformFeedback().
enum brw_query_kind {
OA_COUNTERS,
- PIPELINE_STATS
+ OA_COUNTERS_RAW,
+ PIPELINE_STATS,
};
struct brw_perf_query_register_prog {
uint32_t n_b_counter_regs;
};
+struct brw_uploader {
+ struct brw_bufmgr *bufmgr;
+ struct brw_bo *bo;
+ void *map;
+ uint32_t next_offset;
+ unsigned default_size;
+};
+
/**
* brw_context is derived from gl_context.
*/
struct
{
- /**
- * Send the appropriate state packets to configure depth, stencil, and
- * HiZ buffers (i965+ only)
- */
- void (*emit_depth_stencil_hiz)(struct brw_context *brw,
- struct intel_mipmap_tree *depth_mt,
- uint32_t depth_offset,
- uint32_t depthbuffer_format,
- uint32_t depth_surface_type,
- struct intel_mipmap_tree *stencil_mt,
- bool hiz, bool separate_stencil,
- uint32_t width, uint32_t height,
- uint32_t tile_x, uint32_t tile_y);
-
/**
* Emit an MI_REPORT_PERF_COUNT command packet.
*
* and would need flushing before being used from another cache domain that
* isn't coherent with it (i.e. the sampler).
*/
- struct set *render_cache;
+ struct hash_table *render_cache;
/**
* Set of struct brw_bo * that have been used as a depth buffer within this
struct intel_batchbuffer batch;
- struct {
- struct brw_bo *bo;
- void *map;
- uint32_t next_offset;
- } upload;
+ struct brw_uploader upload;
/**
* Set if rendering has occurred to the drawable's front buffer.
struct {
struct {
- /** The value of gl_BaseVertex for the current _mesa_prim. */
- int gl_basevertex;
+ /**
+ * Either the value of gl_BaseVertex for indexed draw calls or the
+ * value of the argument <first> for non-indexed draw calls for the
+ * current _mesa_prim.
+ */
+ int firstvertex;
/** The value of gl_BaseInstance for the current _mesa_prim. */
int gl_baseinstance;
} params;
/**
- * Buffer and offset used for GL_ARB_shader_draw_parameters
- * (for now, only gl_BaseVertex).
+ * Buffer and offset used for GL_ARB_shader_draw_parameters which will
+ * point to the indirect buffer for indirect draw calls.
*/
struct brw_bo *draw_params_bo;
uint32_t draw_params_offset;
+ struct {
+ /**
+ * The value of gl_DrawID for the current _mesa_prim. This always comes
+ * in from it's own vertex buffer since it's not part of the indirect
+ * draw parameters.
+ */
+ int gl_drawid;
+
+ /**
+ * Stores if the current _mesa_prim is an indexed or non-indexed draw
+ * (~0/0). Useful to calculate gl_BaseVertex as an AND of firstvertex
+ * and is_indexed_draw.
+ */
+ int is_indexed_draw;
+ } derived_params;
+
/**
- * The value of gl_DrawID for the current _mesa_prim. This always comes
- * in from it's own vertex buffer since it's not part of the indirect
- * draw parameters.
+ * Buffer and offset used for GL_ARB_shader_draw_parameters which contains
+ * parameters that are not present in the indirect buffer. They will go in
+ * their own vertex element.
*/
- int gl_drawid;
- struct brw_bo *draw_id_bo;
- uint32_t draw_id_offset;
+ struct brw_bo *derived_draw_params_bo;
+ uint32_t derived_draw_params_offset;
/**
* Pointer to the the buffer storing the indirect draw parameters. It
* Number of samples in ctx->DrawBuffer, updated by BRW_NEW_NUM_SAMPLES so
* that we don't have to reemit that state every time we change FBOs.
*/
- int num_samples;
+ unsigned int num_samples;
/* BRW_NEW_URB_ALLOCATIONS:
*/
*/
struct hash_table *oa_metrics_table;
+ /* Location of the device's sysfs entry. */
+ char sysfs_dev_dir[256];
+
struct brw_perf_query_info *queries;
int n_queries;
struct brw_fast_clear_state *fast_clear_state;
- /* Array of flags telling if auxiliary buffer is disabled for corresponding
- * renderbuffer. If draw_aux_buffer_disabled[i] is set then use of
- * auxiliary buffer for gl_framebuffer::_ColorDrawBuffers[i] is
- * disabled.
- * This is needed in case the same underlying buffer is also configured
- * to be sampled but with a format that the sampling engine can't treat
- * compressed or fast cleared.
+ /* Array of aux usages to use for drawing. Aux usage for render targets is
+ * a bit more complex than simply calling a single function so we need some
+ * way of passing it form brw_draw.c to surface state setup.
*/
- bool draw_aux_buffer_disabled[MAX_DRAW_BUFFERS];
+ enum isl_aux_usage draw_aux_usage[MAX_DRAW_BUFFERS];
__DRIcontext *driContext;
struct intel_screen *screen;
__DRIdrawable *drawable);
void intel_prepare_render(struct brw_context *brw);
-void brw_predraw_resolve_inputs(struct brw_context *brw, bool rendering);
+void brw_predraw_resolve_inputs(struct brw_context *brw, bool rendering,
+ bool *draw_aux_buffer_disabled);
void intel_resolve_for_dri2_flush(struct brw_context *brw,
__DRIdrawable *drawable);
/* brw_draw_upload.c */
unsigned brw_get_vertex_surface_type(struct brw_context *brw,
- const struct gl_vertex_array *glarray);
+ const struct gl_array_attributes *glattr);
static inline unsigned
brw_get_index_type(unsigned index_size)
extern int intel_translate_shadow_compare_func(GLenum func);
extern int intel_translate_compare_func(GLenum func);
extern int intel_translate_stencil_op(GLenum op);
-extern int intel_translate_logic_op(GLenum opcode);
/* brw_sync.c */
void brw_init_syncobj_functions(struct dd_function_table *functions);
void
brw_save_primitives_written_counters(struct brw_context *brw,
struct brw_transform_feedback_object *obj);
-void
-brw_compute_xfb_vertices_written(struct brw_context *brw,
- struct brw_transform_feedback_object *obj);
GLsizei
brw_get_transform_feedback_vertex_count(struct gl_context *ctx,
struct gl_transform_feedback_object *obj,
int dstX0, int dstY0,
int width, int height);
+/* brw_generate_mipmap.c */
+void brw_generate_mipmap(struct gl_context *ctx, GLenum target,
+ struct gl_texture_object *tex_obj);
+
void
gen6_get_sample_position(struct gl_context *ctx,
struct gl_framebuffer *fb,
void
brw_emit_depthbuffer(struct brw_context *brw);
-void
-brw_emit_depth_stencil_hiz(struct brw_context *brw,
- struct intel_mipmap_tree *depth_mt,
- uint32_t depth_offset, uint32_t depthbuffer_format,
- uint32_t depth_surface_type,
- struct intel_mipmap_tree *stencil_mt,
- bool hiz, bool separate_stencil,
- uint32_t width, uint32_t height,
- uint32_t tile_x, uint32_t tile_y);
-
-void
-gen6_emit_depth_stencil_hiz(struct brw_context *brw,
- struct intel_mipmap_tree *depth_mt,
- uint32_t depth_offset, uint32_t depthbuffer_format,
- uint32_t depth_surface_type,
- struct intel_mipmap_tree *stencil_mt,
- bool hiz, bool separate_stencil,
- uint32_t width, uint32_t height,
- uint32_t tile_x, uint32_t tile_y);
-
-void
-gen7_emit_depth_stencil_hiz(struct brw_context *brw,
- struct intel_mipmap_tree *depth_mt,
- uint32_t depth_offset, uint32_t depthbuffer_format,
- uint32_t depth_surface_type,
- struct intel_mipmap_tree *stencil_mt,
- bool hiz, bool separate_stencil,
- uint32_t width, uint32_t height,
- uint32_t tile_x, uint32_t tile_y);
-void
-gen8_emit_depth_stencil_hiz(struct brw_context *brw,
- struct intel_mipmap_tree *depth_mt,
- uint32_t depth_offset, uint32_t depthbuffer_format,
- uint32_t depth_surface_type,
- struct intel_mipmap_tree *stencil_mt,
- bool hiz, bool separate_stencil,
- uint32_t width, uint32_t height,
- uint32_t tile_x, uint32_t tile_y);
-
uint32_t get_hw_prim_for_gl_prim(int mode);
void