X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fv3d%2Fv3d_screen.c;h=bafe730126695dad75127f1544aa4f95562b2c35;hb=583d7d3d8d0d14d636340b0f12f72db7b0148ceb;hp=2d63a43e2ddd3c152aa6c888eeca839f5e222373;hpb=db8743923253466b23299708a2060cbf6c715411;p=mesa.git diff --git a/src/gallium/drivers/v3d/v3d_screen.c b/src/gallium/drivers/v3d/v3d_screen.c index 2d63a43e2dd..bafe7301266 100644 --- a/src/gallium/drivers/v3d/v3d_screen.c +++ b/src/gallium/drivers/v3d/v3d_screen.c @@ -32,7 +32,7 @@ #include "util/u_debug.h" #include "util/u_memory.h" -#include "util/u_format.h" +#include "util/format/u_format.h" #include "util/u_hash_table.h" #include "util/u_screen.h" #include "util/u_transfer_helper.h" @@ -72,13 +72,13 @@ v3d_screen_destroy(struct pipe_screen *pscreen) { struct v3d_screen *screen = v3d_screen(pscreen); - util_hash_table_destroy(screen->bo_handles); + _mesa_hash_table_destroy(screen->bo_handles, NULL); v3d_bufmgr_destroy(pscreen); slab_destroy_parent(&screen->transfer_pool); free(screen->ro); if (using_v3d_simulator) - v3d_simulator_destroy(screen); + v3d_simulator_destroy(screen->sim_file); v3d_compiler_free(screen->compiler); u_transfer_helper_destroy(pscreen->transfer_helper); @@ -123,8 +123,7 @@ v3d_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD: case PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES: case PIPE_CAP_VERTEX_SHADER_SATURATE: - case PIPE_CAP_TEXTURE_QUERY_LOD: - case PIPE_CAP_PRIMITIVE_RESTART: + case PIPE_CAP_PRIMITIVE_RESTART_FIXED_INDEX: case PIPE_CAP_OCCLUSION_QUERY: case PIPE_CAP_POINT_SPRITE: case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME: @@ -139,6 +138,10 @@ v3d_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL: return 1; + case PIPE_CAP_TEXTURE_QUERY_LOD: + return screen->devinfo.ver >= 42; + break; + case PIPE_CAP_PACKED_UNIFORMS: /* We can't enable this flag, because it results in load_ubo * intrinsics across a 16b boundary, but v3d's TMU general @@ -146,6 +149,9 @@ v3d_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) */ return 0; + case PIPE_CAP_NIR_IMAGES_AS_DEREF: + return 0; + case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER: /* XXX perf: we don't want to emit these extra blits for * glReadPixels(), since we still have to do an uncached read @@ -183,6 +189,9 @@ v3d_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_GLSL_FEATURE_LEVEL: return 330; + case PIPE_CAP_ESSL_FEATURE_LEVEL: + return 310; + case PIPE_CAP_GLSL_FEATURE_LEVEL_COMPATIBILITY: return 140; @@ -248,8 +257,15 @@ v3d_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_UMA: return 1; - case PIPE_CAP_ALPHA_TEST: - return 0; + /* Geometry shaders */ + case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS: + /* Minimum required by GLES 3.2 */ + return 1024; + case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES: + /* MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS / 4 */ + return 256; + case PIPE_CAP_MAX_GS_INVOCATIONS: + return 32; default: return u_pipe_screen_get_param_defaults(pscreen, param); @@ -297,6 +313,10 @@ v3d_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader, if (!screen->has_csd) return 0; break; + case PIPE_SHADER_GEOMETRY: + if (screen->devinfo.ver < 41) + return 0; + break; default: return 0; } @@ -313,10 +333,16 @@ v3d_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader, return UINT_MAX; case PIPE_SHADER_CAP_MAX_INPUTS: - if (shader == PIPE_SHADER_FRAGMENT) - return V3D_MAX_FS_INPUTS / 4; - else + switch (shader) { + case PIPE_SHADER_VERTEX: return V3D_MAX_VS_INPUTS / 4; + case PIPE_SHADER_GEOMETRY: + return V3D_MAX_GS_INPUTS / 4; + case PIPE_SHADER_FRAGMENT: + return V3D_MAX_FS_INPUTS / 4; + default: + return 0; + }; case PIPE_SHADER_CAP_MAX_OUTPUTS: if (shader == PIPE_SHADER_FRAGMENT) return 4; @@ -334,6 +360,7 @@ v3d_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader, case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED: return 0; case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR: + return 1; case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR: return 0; case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR: @@ -345,6 +372,8 @@ v3d_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader, case PIPE_SHADER_CAP_INTEGERS: return 1; case PIPE_SHADER_CAP_FP16: + case PIPE_SHADER_CAP_FP16_DERIVATIVES: + case PIPE_SHADER_CAP_INT16: case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED: case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED: case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED: @@ -360,9 +389,10 @@ v3d_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader, case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS: if (screen->has_cache_flush) { - if (shader == PIPE_SHADER_VERTEX) + if (shader == PIPE_SHADER_VERTEX || + shader == PIPE_SHADER_GEOMETRY) { return 0; - + } return PIPE_MAX_SHADER_BUFFERS; } else { return 0; @@ -587,18 +617,6 @@ v3d_screen_is_format_supported(struct pipe_screen *pscreen, return true; } -#define PTR_TO_UINT(x) ((unsigned)((intptr_t)(x))) - -static unsigned handle_hash(void *key) -{ - return PTR_TO_UINT(key); -} - -static int handle_compare(void *key1, void *key2) -{ - return PTR_TO_UINT(key1) != PTR_TO_UINT(key2); -} - static const void * v3d_screen_get_compiler_options(struct pipe_screen *pscreen, enum pipe_shader_ir ir, unsigned shader) @@ -661,10 +679,10 @@ v3d_screen_create(int fd, const struct pipe_screen_config *config, } list_inithead(&screen->bo_cache.time_list); (void)mtx_init(&screen->bo_handles_mutex, mtx_plain); - screen->bo_handles = util_hash_table_create(handle_hash, handle_compare); + screen->bo_handles = util_hash_table_create_ptr_keys(); #if defined(USE_V3D_SIMULATOR) - v3d_simulator_init(screen); + screen->sim_file = v3d_simulator_init(screen->fd); #endif if (!v3d_get_device_info(screen->fd, &screen->devinfo, &v3d_ioctl))