X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fi965%2Fbrw_context.h;h=1a4efa3cb0cbd9385ba664e0c8e6274ef074b0f7;hb=9c9f45b82410646d2f7a8576d03de9916118bf07;hp=0239b6214ae2519390ef419d2a772e0c9a741bf4;hpb=239a4bdcd44529e9495d9e68cf5a157421753b3c;p=mesa.git diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 0239b6214ae..1a4efa3cb0c 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -40,6 +40,8 @@ #include "brw_compiler.h" #include "intel_aub.h" +#include "isl/isl.h" + #ifdef __cplusplus extern "C" { /* Evil hack for using libdrm in a c++ compiler. */ @@ -161,7 +163,7 @@ enum brw_pipeline { enum brw_cache_id { BRW_CACHE_FS_PROG, - BRW_CACHE_BLORP_BLIT_PROG, + BRW_CACHE_BLORP_PROG, BRW_CACHE_SF_PROG, BRW_CACHE_VS_PROG, BRW_CACHE_FF_GS_PROG, @@ -221,6 +223,8 @@ enum brw_state_id { BRW_STATE_COMPUTE_PROGRAM, BRW_STATE_CS_WORK_GROUPS, BRW_STATE_URB_SIZE, + BRW_STATE_CC_STATE, + BRW_STATE_BLORP, BRW_NUM_STATE_BITS }; @@ -250,7 +254,7 @@ enum brw_state_id { * polluting the brw_state_cache code with special cases, we retain the dirty * bit for now. It should eventually be removed. */ -#define BRW_NEW_BLORP_BLIT_PROG_DATA (1ull << BRW_CACHE_BLORP_BLIT_PROG) +#define BRW_NEW_BLORP_BLIT_PROG_DATA (1ull << BRW_CACHE_BLORP_PROG) #define BRW_NEW_SF_PROG_DATA (1ull << BRW_CACHE_SF_PROG) #define BRW_NEW_VS_PROG_DATA (1ull << BRW_CACHE_VS_PROG) #define BRW_NEW_FF_GS_PROG_DATA (1ull << BRW_CACHE_FF_GS_PROG) @@ -309,6 +313,8 @@ enum brw_state_id { #define BRW_NEW_COMPUTE_PROGRAM (1ull << BRW_STATE_COMPUTE_PROGRAM) #define BRW_NEW_CS_WORK_GROUPS (1ull << BRW_STATE_CS_WORK_GROUPS) #define BRW_NEW_URB_SIZE (1ull << BRW_STATE_URB_SIZE) +#define BRW_NEW_CC_STATE (1ull << BRW_STATE_CC_STATE) +#define BRW_NEW_BLORP (1ull << BRW_STATE_BLORP) struct brw_state_flags { /** State update flags signalled by mesa internals */ @@ -362,7 +368,7 @@ struct brw_compute_program { struct brw_shader { - struct gl_shader base; + struct gl_linked_shader base; bool compiled_once; }; @@ -386,7 +392,7 @@ struct interpolation_mode_map { static inline bool brw_any_flat_varyings(struct interpolation_mode_map *map) { for (int i = 0; i < BRW_VARYING_SLOT_COUNT; i++) - if (map->mode[i] == INTERP_QUALIFIER_FLAT) + if (map->mode[i] == INTERP_MODE_FLAT) return true; return false; @@ -395,7 +401,7 @@ static inline bool brw_any_flat_varyings(struct interpolation_mode_map *map) static inline bool brw_any_noperspective_varyings(struct interpolation_mode_map *map) { for (int i = 0; i < BRW_VARYING_SLOT_COUNT; i++) - if (map->mode[i] == INTERP_QUALIFIER_NOPERSPECTIVE) + if (map->mode[i] == INTERP_MODE_NOPERSPECTIVE) return true; return false; @@ -565,6 +571,7 @@ struct brw_vertex_buffer { /** Buffer object containing the uploaded vertex data */ drm_intel_bo *bo; uint32_t offset; + uint32_t size; /** Byte stride between elements in the uploaded array */ GLuint stride; GLuint step_rate; @@ -615,6 +622,7 @@ struct intel_batchbuffer { uint32_t state_batch_offset; enum brw_gpu_ring ring; bool needs_sol_reset; + bool state_base_address_emitted; struct { uint32_t *map_next; @@ -668,9 +676,28 @@ struct brw_stage_state /** * Optional scratch buffer used to store spilled register values and * variably-indexed GRF arrays. + * + * The contents of this buffer are short-lived so the same memory can be + * re-used at will for multiple shader programs (executed by the same fixed + * function). However reusing a scratch BO for which shader invocations + * are still in flight with a per-thread scratch slot size other than the + * original can cause threads with different scratch slot size and FFTID + * (which may be executed in parallel depending on the shader stage and + * hardware generation) to map to an overlapping region of the scratch + * space, which can potentially lead to mutual scratch space corruption. + * For that reason if you borrow this scratch buffer you should only be + * using the slot size given by the \c per_thread_scratch member below, + * unless you're taking additional measures to synchronize thread execution + * across slot size changes. */ drm_intel_bo *scratch_bo; + /** + * Scratch slot size allocated for each thread in the buffer object given + * by \c scratch_bo. + */ + uint32_t per_thread_scratch; + /** Offset in the program cache to the program */ uint32_t prog_offset; @@ -717,34 +744,10 @@ struct brw_context struct { - void (*update_texture_surface)(struct gl_context *ctx, - unsigned unit, - uint32_t *surf_offset, - bool for_gather); uint32_t (*update_renderbuffer_surface)(struct brw_context *brw, struct gl_renderbuffer *rb, bool layered, unsigned unit, uint32_t surf_index); - - void (*emit_texture_surface_state)(struct brw_context *brw, - struct intel_mipmap_tree *mt, - GLenum target, - unsigned min_layer, - unsigned max_layer, - unsigned min_level, - unsigned max_level, - unsigned format, - unsigned swizzle, - uint32_t *surf_offset, - bool rw, bool for_gather); - void (*emit_buffer_surface_state)(struct brw_context *brw, - uint32_t *out_offset, - drm_intel_bo *bo, - unsigned buffer_offset, - unsigned surface_format, - unsigned buffer_size, - unsigned pitch, - bool rw); void (*emit_null_surface_state)(struct brw_context *brw, unsigned width, unsigned height, @@ -834,6 +837,7 @@ struct brw_context bool always_flush_cache; bool disable_throttling; bool precompile; + bool dual_color_blend_by_location; driOptionCache optionCache; /** @} */ @@ -849,7 +853,7 @@ struct brw_context */ bool perf_debug; - uint32_t max_gtt_map_object_size; + uint64_t max_gtt_map_object_size; int gen; int gt; @@ -887,6 +891,8 @@ struct brw_context */ bool needs_unlit_centroid_workaround; + struct isl_device isl_dev; + GLuint NewGLState; struct { struct brw_state_flags pipelines[BRW_NUM_PIPELINES]; @@ -897,7 +903,7 @@ struct brw_context struct brw_cache cache; /** IDs for meta stencil blit shader programs. */ - unsigned meta_stencil_blit_programs[2]; + struct gl_shader_program *meta_stencil_blit_programs[2]; /* Whether a meta-operation is in progress. */ bool meta_in_progress; @@ -909,8 +915,13 @@ struct brw_context uint32_t pma_stall_bits; struct { - /** The value of gl_BaseVertex for the current _mesa_prim. */ - int gl_basevertex; + struct { + /** The value of gl_BaseVertex for the current _mesa_prim. */ + int gl_basevertex; + + /** The value of gl_BaseInstance for the current _mesa_prim. */ + int gl_baseinstance; + } params; /** * Buffer and offset used for GL_ARB_shader_draw_parameters @@ -918,6 +929,15 @@ struct brw_context */ drm_intel_bo *draw_params_bo; uint32_t draw_params_offset; + + /** + * 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; + drm_intel_bo *draw_id_bo; + uint32_t draw_id_offset; } draw; struct { @@ -942,6 +962,7 @@ struct brw_context /* Summary of size and varying of active arrays, so we can check * for changes to this state: */ + bool index_bounds_valid; unsigned int min_index, max_index; /* Offset from start of vertex buffer so we can avoid redefining @@ -968,6 +989,7 @@ struct brw_context /* Updates are signaled by BRW_NEW_INDEX_BUFFER. */ drm_intel_bo *bo; + uint32_t size; GLuint type; /* Offset to index buffer index to use in CMD_3D_PRIM so that we can @@ -1248,7 +1270,7 @@ struct brw_context int num_atoms[BRW_NUM_PIPELINES]; const struct brw_tracked_state render_atoms[76]; - const struct brw_tracked_state compute_atoms[10]; + const struct brw_tracked_state compute_atoms[11]; /* If (INTEL_DEBUG & DEBUG_BATCH) */ struct { @@ -1289,6 +1311,7 @@ struct brw_context uint32_t num_instances; int basevertex; + int baseinstance; struct { const struct brw_l3_config *config; @@ -1324,7 +1347,8 @@ extern void intelInitClearFuncs(struct dd_function_table *functions); */ extern const char *const brw_vendor_string; -extern const char *brw_get_renderer_string(unsigned deviceID); +extern const char * +brw_get_renderer_string(const struct intel_screen *intelScreen); enum { DRI_CONF_BO_REUSE_DISABLED, @@ -1351,37 +1375,9 @@ GLboolean brwCreateContext(gl_api api, /*====================================================================== * brw_misc_state.c */ -GLuint brw_get_rb_for_slice(struct brw_context *brw, - struct intel_mipmap_tree *mt, - unsigned level, unsigned layer, bool flat); - -void brw_meta_updownsample(struct brw_context *brw, - struct intel_mipmap_tree *src, - struct intel_mipmap_tree *dst); - -void brw_meta_fbo_stencil_blit(struct brw_context *brw, - struct gl_framebuffer *read_fb, - struct gl_framebuffer *draw_fb, - GLfloat srcX0, GLfloat srcY0, - GLfloat srcX1, GLfloat srcY1, - GLfloat dstX0, GLfloat dstY0, - GLfloat dstX1, GLfloat dstY1); - -void brw_meta_stencil_updownsample(struct brw_context *brw, - struct intel_mipmap_tree *src, - struct intel_mipmap_tree *dst); - -bool brw_meta_fast_clear(struct brw_context *brw, - struct gl_framebuffer *fb, - GLbitfield mask, - bool partial_clear); - void brw_meta_resolve_color(struct brw_context *brw, struct intel_mipmap_tree *mt); -void -brw_meta_fast_clear_free(struct brw_context *brw); - /*====================================================================== * brw_misc_state.c @@ -1405,13 +1401,16 @@ void brw_init_common_queryobj_functions(struct dd_function_table *functions); void gen4_init_queryobj_functions(struct dd_function_table *functions); void brw_emit_query_begin(struct brw_context *brw); void brw_emit_query_end(struct brw_context *brw); +void brw_query_counter(struct gl_context *ctx, struct gl_query_object *q); +bool brw_is_query_pipelined(struct brw_query_object *query); /** gen6_queryobj.c */ void gen6_init_queryobj_functions(struct dd_function_table *functions); void brw_write_timestamp(struct brw_context *brw, drm_intel_bo *bo, int idx); void brw_write_depth_count(struct brw_context *brw, drm_intel_bo *bo, int idx); -void brw_store_register_mem64(struct brw_context *brw, - drm_intel_bo *bo, uint32_t reg, int idx); + +/** hsw_queryobj.c */ +void hsw_init_queryobj_functions(struct dd_function_table *functions); /** brw_conditional_render.c */ void brw_init_conditional_render_functions(struct dd_function_table *functions); @@ -1428,6 +1427,22 @@ void brw_load_register_mem64(struct brw_context *brw, drm_intel_bo *bo, uint32_t read_domains, uint32_t write_domain, uint32_t offset); +void brw_store_register_mem32(struct brw_context *brw, + drm_intel_bo *bo, uint32_t reg, uint32_t offset); +void brw_store_register_mem64(struct brw_context *brw, + drm_intel_bo *bo, uint32_t reg, uint32_t offset); +void brw_load_register_imm32(struct brw_context *brw, + uint32_t reg, uint32_t imm); +void brw_load_register_imm64(struct brw_context *brw, + uint32_t reg, uint64_t imm); +void brw_load_register_reg(struct brw_context *brw, uint32_t src, + uint32_t dest); +void brw_load_register_reg64(struct brw_context *brw, uint32_t src, + uint32_t dest); +void brw_store_data_imm32(struct brw_context *brw, drm_intel_bo *bo, + uint32_t offset, uint32_t imm); +void brw_store_data_imm64(struct brw_context *brw, drm_intel_bo *bo, + uint32_t offset, uint64_t imm); /*====================================================================== * brw_state_dump.c @@ -1436,7 +1451,7 @@ void brw_debug_batch(struct brw_context *brw); void brw_annotate_aub(struct brw_context *brw); /*====================================================================== - * brw_tex.c + * intel_tex_validate.c */ void brw_validate_textures( struct brw_context *brw ); @@ -1460,10 +1475,14 @@ void brwInitFragProgFuncs( struct dd_function_table *functions ); static inline int brw_get_scratch_size(int size) { - return util_next_power_of_two(size | 1023); + return MAX2(1024, util_next_power_of_two(size)); } void brw_get_scratch_bo(struct brw_context *brw, drm_intel_bo **scratch_bo, int size); +void brw_alloc_stage_scratch(struct brw_context *brw, + struct brw_stage_state *stage_state, + unsigned per_thread_size, + unsigned thread_count); void brw_init_shader_time(struct brw_context *brw); int brw_get_shader_time_index(struct brw_context *brw, struct gl_shader_program *shader_prog, @@ -1541,26 +1560,22 @@ brw_update_sol_surface(struct brw_context *brw, uint32_t *out_offset, unsigned num_vector_components, unsigned stride_dwords, unsigned offset_dwords); void brw_upload_ubo_surfaces(struct brw_context *brw, - struct gl_shader *shader, + struct gl_linked_shader *shader, struct brw_stage_state *stage_state, struct brw_stage_prog_data *prog_data); void brw_upload_abo_surfaces(struct brw_context *brw, - struct gl_shader *shader, + struct gl_linked_shader *shader, struct brw_stage_state *stage_state, struct brw_stage_prog_data *prog_data); void brw_upload_image_surfaces(struct brw_context *brw, - struct gl_shader *shader, + struct gl_linked_shader *shader, struct brw_stage_state *stage_state, struct brw_stage_prog_data *prog_data); /* brw_surface_formats.c */ bool brw_render_target_supported(struct brw_context *brw, struct gl_renderbuffer *rb); -bool brw_losslessly_compressible_format(struct brw_context *brw, - uint32_t brw_format); uint32_t brw_depth_format(struct brw_context *brw, mesa_format format); -mesa_format brw_lower_mesa_image_format(const struct brw_device_info *devinfo, - mesa_format format); /* brw_performance_monitor.c */ void brw_init_performance_monitors(struct brw_context *brw); @@ -1617,6 +1632,20 @@ void gen7_resume_transform_feedback(struct gl_context *ctx, struct gl_transform_feedback_object *obj); +/* hsw_sol.c */ +void +hsw_begin_transform_feedback(struct gl_context *ctx, GLenum mode, + struct gl_transform_feedback_object *obj); +void +hsw_end_transform_feedback(struct gl_context *ctx, + struct gl_transform_feedback_object *obj); +void +hsw_pause_transform_feedback(struct gl_context *ctx, + struct gl_transform_feedback_object *obj); +void +hsw_resume_transform_feedback(struct gl_context *ctx, + struct gl_transform_feedback_object *obj); + /* brw_blorp_blit.cpp */ GLbitfield brw_blorp_framebuffer(struct brw_context *brw, @@ -1663,20 +1692,14 @@ gen7_emit_push_constant_state(struct brw_context *brw, unsigned vs_size, unsigned gs_size, unsigned fs_size); void -gen7_emit_urb_state(struct brw_context *brw, - unsigned nr_vs_entries, - unsigned vs_size, unsigned vs_start, - unsigned nr_hs_entries, - unsigned hs_size, unsigned hs_start, - unsigned nr_ds_entries, - unsigned ds_size, unsigned ds_start, - unsigned nr_gs_entries, - unsigned gs_size, unsigned gs_start); - +gen7_upload_urb(struct brw_context *brw, unsigned vs_size, + bool gs_present, bool tess_present); /* brw_reset.c */ extern GLenum brw_get_graphics_reset_status(struct gl_context *ctx); +void +brw_check_for_reset(struct brw_context *brw); /* brw_compute.c */ extern void @@ -1772,15 +1795,7 @@ brw_program_reloc(struct brw_context *brw, uint32_t state_offset, bool brw_do_cubemap_normalize(struct exec_list *instructions); bool brw_lower_texture_gradients(struct brw_context *brw, struct exec_list *instructions); -bool brw_do_lower_unnormalized_offset(struct exec_list *instructions); - -struct opcode_desc { - char *name; - int nsrc; - int ndst; -}; -extern const struct opcode_desc opcode_descs[128]; extern const char * const conditional_modifier[16]; extern const char *const pred_ctrl_align16[16]; @@ -1857,6 +1872,11 @@ void brw_emit_depth_stall_flushes(struct brw_context *brw); void gen7_emit_vs_workaround_flush(struct brw_context *brw); void gen7_emit_cs_stall_flush(struct brw_context *brw); +/* brw_queryformat.c */ +void brw_query_internal_format(struct gl_context *ctx, GLenum target, + GLenum internalFormat, GLenum pname, + GLint *params); + #ifdef __cplusplus } #endif