summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/vc4/vc4_screen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/vc4/vc4_screen.c')
-rw-r--r--src/gallium/drivers/vc4/vc4_screen.c311
1 files changed, 114 insertions, 197 deletions
diff --git a/src/gallium/drivers/vc4/vc4_screen.c b/src/gallium/drivers/vc4/vc4_screen.c
index 40d49cc6b0c..61f719b65a3 100644
--- a/src/gallium/drivers/vc4/vc4_screen.c
+++ b/src/gallium/drivers/vc4/vc4_screen.c
@@ -27,13 +27,13 @@
#include "pipe/p_screen.h"
#include "pipe/p_state.h"
-#include "util/u_cpu_detect.h"
#include "util/u_debug.h"
#include "util/u_memory.h"
#include "util/format/u_format.h"
#include "util/u_hash_table.h"
#include "util/u_screen.h"
#include "util/u_transfer_helper.h"
+#include "util/perf/cpu_trace.h"
#include "util/ralloc.h"
#include <xf86drm.h>
@@ -70,11 +70,11 @@ static const struct debug_named_value vc4_debug_options[] = {
{ "dump", VC4_DEBUG_DUMP,
"Write a GPU command stream trace file" },
#endif
- { NULL }
+ DEBUG_NAMED_VALUE_END
};
DEBUG_GET_ONCE_FLAGS_OPTION(vc4_debug, "VC4_DEBUG", vc4_debug_options, 0)
-uint32_t vc4_debug;
+uint32_t vc4_mesa_debug;
static const char *
vc4_screen_get_name(struct pipe_screen *pscreen)
@@ -132,191 +132,101 @@ vc4_has_feature(struct vc4_screen *screen, uint32_t feature)
return p.value;
}
-static int
-vc4_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
+static void
+vc4_init_shader_caps(struct vc4_screen *screen)
{
- struct vc4_screen *screen = vc4_screen(pscreen);
-
- switch (param) {
- /* Supported features (boolean caps). */
- case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
- case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
- case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
- case PIPE_CAP_NPOT_TEXTURES:
- case PIPE_CAP_BLEND_EQUATION_SEPARATE:
- case PIPE_CAP_TEXTURE_MULTISAMPLE:
- case PIPE_CAP_TEXTURE_SWIZZLE:
- case PIPE_CAP_TEXTURE_BARRIER:
- case PIPE_CAP_TGSI_TEXCOORD:
- return 1;
-
- case PIPE_CAP_NATIVE_FENCE_FD:
- return screen->has_syncobj;
-
- case PIPE_CAP_TILE_RASTER_ORDER:
- return vc4_has_feature(screen,
- DRM_VC4_PARAM_SUPPORTS_FIXED_RCL_ORDER);
-
- /* lying for GL 2.0 */
- case PIPE_CAP_OCCLUSION_QUERY:
- case PIPE_CAP_POINT_SPRITE:
- return 1;
-
- case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
- case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
- case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:
- return 1;
-
- case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
- case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
- return 1;
-
- /* Texturing. */
- case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
- return 2048;
- case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
- return VC4_MAX_MIP_LEVELS;
- case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
- /* Note: Not supported in hardware, just faking it. */
- return 5;
-
- case PIPE_CAP_MAX_VARYINGS:
- return 8;
-
- case PIPE_CAP_VENDOR_ID:
- return 0x14E4;
- case PIPE_CAP_ACCELERATED:
- return 1;
- case PIPE_CAP_VIDEO_MEMORY: {
- uint64_t system_memory;
-
- if (!os_get_total_physical_memory(&system_memory))
- return 0;
-
- return (int)(system_memory >> 20);
+ for (unsigned i = 0; i <= PIPE_SHADER_FRAGMENT; i++) {
+ struct pipe_shader_caps *caps =
+ (struct pipe_shader_caps *)&screen->base.shader_caps[i];
+
+ if (i != PIPE_SHADER_VERTEX && i != PIPE_SHADER_FRAGMENT)
+ continue;
+
+ caps->max_instructions =
+ caps->max_alu_instructions =
+ caps->max_tex_instructions =
+ caps->max_tex_indirections = 16384;
+
+ caps->max_control_flow_depth = screen->has_control_flow;
+ caps->max_inputs = 8;
+ caps->max_outputs = i == PIPE_SHADER_FRAGMENT ? 1 : 8;
+ caps->max_temps = 256; /* GL_MAX_PROGRAM_TEMPORARIES_ARB */
+ caps->max_const_buffer0_size = 16 * 1024 * sizeof(float);
+ caps->max_const_buffers = 1;
+ caps->indirect_const_addr = true;
+ caps->integers = true;
+ caps->max_texture_samplers =
+ caps->max_sampler_views = VC4_MAX_TEXTURE_SAMPLERS;
+ caps->supported_irs = 1 << PIPE_SHADER_IR_NIR;
}
- case PIPE_CAP_UMA:
- return 1;
+}
- case PIPE_CAP_ALPHA_TEST:
- case PIPE_CAP_VERTEX_COLOR_CLAMPED:
- case PIPE_CAP_TWO_SIDED_COLOR:
- case PIPE_CAP_TEXRECT:
- return 0;
+static void
+vc4_init_screen_caps(struct vc4_screen *screen)
+{
+ struct pipe_caps *caps = (struct pipe_caps *)&screen->base.caps;
- case PIPE_CAP_SUPPORTED_PRIM_MODES:
- return screen->prim_types;
+ u_init_pipe_screen_caps(&screen->base, 1);
- default:
- return u_pipe_screen_get_param_defaults(pscreen, param);
- }
-}
+ /* Supported features (boolean caps). */
+ caps->vertex_color_unclamped = true;
+ caps->fragment_color_clamped = true;
+ caps->npot_textures = true;
+ caps->blend_equation_separate = true;
+ caps->texture_multisample = true;
+ caps->texture_swizzle = true;
+ caps->texture_barrier = true;
+ caps->tgsi_texcoord = true;
-static float
-vc4_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param)
-{
- switch (param) {
- case PIPE_CAPF_MAX_LINE_WIDTH:
- case PIPE_CAPF_MAX_LINE_WIDTH_AA:
- return 32;
-
- case PIPE_CAPF_MAX_POINT_WIDTH:
- case PIPE_CAPF_MAX_POINT_WIDTH_AA:
- return 512.0f;
-
- case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
- return 0.0f;
- case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
- return 0.0f;
-
- case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
- case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
- case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
- return 0.0f;
- default:
- fprintf(stderr, "unknown paramf %d\n", param);
- return 0;
- }
-}
+ caps->native_fence_fd = screen->has_syncobj;
-static int
-vc4_screen_get_shader_param(struct pipe_screen *pscreen,
- enum pipe_shader_type shader,
- enum pipe_shader_cap param)
-{
- if (shader != PIPE_SHADER_VERTEX &&
- shader != PIPE_SHADER_FRAGMENT) {
- return 0;
- }
+ caps->tile_raster_order =
+ vc4_has_feature(screen, DRM_VC4_PARAM_SUPPORTS_FIXED_RCL_ORDER);
- /* this is probably not totally correct.. but it's a start: */
- switch (param) {
- case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
- case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
- case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
- case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
- return 16384;
-
- case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
- return vc4_screen(pscreen)->has_control_flow;
-
- case PIPE_SHADER_CAP_MAX_INPUTS:
- return 8;
- case PIPE_SHADER_CAP_MAX_OUTPUTS:
- return shader == PIPE_SHADER_FRAGMENT ? 1 : 8;
- case PIPE_SHADER_CAP_MAX_TEMPS:
- return 256; /* GL_MAX_PROGRAM_TEMPORARIES_ARB */
- case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
- return 16 * 1024 * sizeof(float);
- case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
- return 1;
- case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
- return 0;
- case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
- case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
- case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
- return 0;
- case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
- return 1;
- case PIPE_SHADER_CAP_SUBROUTINES:
- return 0;
- case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
- return 0;
- case PIPE_SHADER_CAP_INTEGERS:
- return 1;
- case PIPE_SHADER_CAP_INT64_ATOMICS:
- case PIPE_SHADER_CAP_FP16:
- case PIPE_SHADER_CAP_FP16_DERIVATIVES:
- case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:
- case PIPE_SHADER_CAP_INT16:
- case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:
- case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
- case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
- case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
- case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
- case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
- return 0;
- case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
- case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
- return VC4_MAX_TEXTURE_SAMPLERS;
- case PIPE_SHADER_CAP_PREFERRED_IR:
- return PIPE_SHADER_IR_NIR;
- case PIPE_SHADER_CAP_SUPPORTED_IRS:
- return 1 << PIPE_SHADER_IR_NIR;
- case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
- return 32;
- case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
- case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
- case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:
- case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS:
- case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:
- case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:
- return 0;
- default:
- fprintf(stderr, "unknown shader param %d\n", param);
- return 0;
- }
- return 0;
+ caps->fs_coord_origin_upper_left = true;
+ caps->fs_coord_pixel_center_half_integer = true;
+ caps->fs_face_is_integer_sysval = true;
+
+ caps->mixed_framebuffer_sizes = true;
+ caps->mixed_color_depth_bits = true;
+
+ /* Texturing. */
+ caps->max_texture_2d_size = 2048;
+ caps->max_texture_cube_levels = VC4_MAX_MIP_LEVELS;
+ caps->max_texture_3d_levels = 0;
+
+ caps->max_varyings = 8;
+
+ caps->vendor_id = 0x14E4;
+
+ uint64_t system_memory;
+ caps->video_memory = os_get_total_physical_memory(&system_memory) ?
+ system_memory >> 20 : 0;
+
+ caps->uma = true;
+
+ caps->alpha_test = false;
+ caps->vertex_color_clamped = false;
+ caps->two_sided_color = false;
+ caps->texrect = false;
+ caps->image_store_formatted = false;
+ caps->clip_planes = 0;
+
+ caps->supported_prim_modes = screen->prim_types;
+
+ caps->min_line_width =
+ caps->min_line_width_aa =
+ caps->min_point_size =
+ caps->min_point_size_aa = 1;
+
+ caps->point_size_granularity =
+ caps->line_width_granularity = 0.1;
+
+ caps->max_line_width =
+ caps->max_line_width_aa = 32;
+
+ caps->max_point_size =
+ caps->max_point_size_aa = 512.0f;
}
static bool
@@ -539,20 +449,29 @@ vc4_get_chip_info(struct vc4_screen *screen)
return true;
}
+static int
+vc4_screen_get_fd(struct pipe_screen *pscreen)
+{
+ struct vc4_screen *screen = vc4_screen(pscreen);
+
+ return screen->fd;
+}
+
struct pipe_screen *
-vc4_screen_create(int fd, struct renderonly *ro)
+vc4_screen_create(int fd, const struct pipe_screen_config *config,
+ struct renderonly *ro)
{
struct vc4_screen *screen = rzalloc(NULL, struct vc4_screen);
uint64_t syncobj_cap = 0;
struct pipe_screen *pscreen;
int err;
+ util_cpu_trace_init();
+
pscreen = &screen->base;
pscreen->destroy = vc4_screen_destroy;
- pscreen->get_param = vc4_screen_get_param;
- pscreen->get_paramf = vc4_screen_get_paramf;
- pscreen->get_shader_param = vc4_screen_get_shader_param;
+ pscreen->get_screen_fd = vc4_screen_get_fd;
pscreen->context_create = vc4_context_create;
pscreen->is_format_supported = vc4_screen_is_format_supported;
@@ -581,15 +500,11 @@ vc4_screen_create(int fd, struct renderonly *ro)
if (!vc4_get_chip_info(screen))
goto fail;
- util_cpu_detect();
-
slab_create_parent(&screen->transfer_pool, sizeof(struct vc4_transfer), 16);
vc4_fence_screen_init(screen);
- vc4_debug = debug_get_option_vc4_debug();
- if (vc4_debug & VC4_DEBUG_SHADERDB)
- vc4_debug |= VC4_DEBUG_NORAST;
+ vc4_mesa_debug = debug_get_option_vc4_debug();
#ifdef USE_VC4_SIMULATOR
vc4_simulator_init(screen);
@@ -610,14 +525,16 @@ vc4_screen_create(int fd, struct renderonly *ro)
}
/* Generate the bitmask of supported draw primitives. */
- screen->prim_types = BITFIELD_BIT(PIPE_PRIM_POINTS) |
- BITFIELD_BIT(PIPE_PRIM_LINES) |
- BITFIELD_BIT(PIPE_PRIM_LINE_LOOP) |
- BITFIELD_BIT(PIPE_PRIM_LINE_STRIP) |
- BITFIELD_BIT(PIPE_PRIM_TRIANGLES) |
- BITFIELD_BIT(PIPE_PRIM_TRIANGLE_STRIP) |
- BITFIELD_BIT(PIPE_PRIM_TRIANGLE_FAN);
-
+ screen->prim_types = BITFIELD_BIT(MESA_PRIM_POINTS) |
+ BITFIELD_BIT(MESA_PRIM_LINES) |
+ BITFIELD_BIT(MESA_PRIM_LINE_LOOP) |
+ BITFIELD_BIT(MESA_PRIM_LINE_STRIP) |
+ BITFIELD_BIT(MESA_PRIM_TRIANGLES) |
+ BITFIELD_BIT(MESA_PRIM_TRIANGLE_STRIP) |
+ BITFIELD_BIT(MESA_PRIM_TRIANGLE_FAN);
+
+ vc4_init_shader_caps(screen);
+ vc4_init_screen_caps(screen);
return pscreen;