#include "lima_bo.h"
#include "lima_fence.h"
#include "lima_format.h"
-#include "lima_util.h"
#include "ir/lima_ir.h"
#include "xf86drm.h"
int lima_plb_max_blk = 0;
+int lima_plb_pp_stream_cache_size = 0;
static void
lima_screen_destroy(struct pipe_screen *pscreen)
{
struct lima_screen *screen = lima_screen(pscreen);
- lima_dump_file_close();
-
slab_destroy_parent(&screen->transfer_pool);
if (screen->ro)
case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
return 0;
+ case PIPE_CAP_ALPHA_TEST:
+ case PIPE_CAP_FLATSHADE:
+ case PIPE_CAP_TWO_SIDED_COLOR:
+ case PIPE_CAP_CLIP_PLANES:
+ return 0;
+
+ case PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES:
+ return 1;
+
default:
return u_pipe_screen_get_param_defaults(pscreen, param);
}
case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
return 16.0f;
case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
- return 16.0f;
+ return 15.0f;
default:
return 0.0f;
case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
return 16384; /* need investigate */
+ case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
+ return 1024;
+
case PIPE_SHADER_CAP_MAX_INPUTS:
return 16; /* attributes */
return LIMA_MAX_VARYING_NUM; /* varying */
case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
- return 4096; /* need investigate */
+ return 16 * 1024 * sizeof(float);
+
case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
return 1;
case PIPE_SHADER_CAP_MAX_TEMPS:
return 256; /* need investigate */
+ case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
+ return 32;
+
default:
return 0;
}
case PIPE_SHADER_CAP_MAX_INPUTS:
return LIMA_MAX_VARYING_NUM - 1; /* varying, minus gl_Position */
+ case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
+ return 1024;
+
case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
- return 4096; /* need investigate */
+ return 16 * 1024 * sizeof(float);
+
case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
return 1;
case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
return 0;
+ case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
+ return 32;
+
default:
return 0;
}
if (usage & PIPE_BIND_DEPTH_STENCIL) {
switch (format) {
- case PIPE_FORMAT_Z16_UNORM:
case PIPE_FORMAT_Z24_UNORM_S8_UINT:
case PIPE_FORMAT_Z24X8_UNORM:
break;
static bool
lima_screen_query_info(struct lima_screen *screen)
{
+ drmVersionPtr version = drmGetVersion(screen->fd);
+ if (!version)
+ return false;
+
+ if (version->version_major > 1 || version->version_minor > 0)
+ screen->has_growable_heap_buffer = true;
+
+ drmFreeVersion(version);
+
+ if (lima_debug & LIMA_DEBUG_NO_GROW_HEAP)
+ screen->has_growable_heap_buffer = false;
+
struct drm_lima_get_param param;
memset(¶m, 0, sizeof(param));
"disable BO cache" },
{ "bocache", LIMA_DEBUG_BO_CACHE,
"print debug info for BO cache" },
+ { "notiling", LIMA_DEBUG_NO_TILING,
+ "don't use tiled buffers" },
+ { "nogrowheap", LIMA_DEBUG_NO_GROW_HEAP,
+ "disable growable heap buffer" },
+ { "singlejob", LIMA_DEBUG_SINGLE_JOB,
+ "disable multi job optimization" },
{ NULL }
};
{
lima_debug = debug_get_option_lima_debug();
- if (lima_debug & LIMA_DEBUG_DUMP)
- lima_dump_file_open();
-
lima_ctx_num_plb = debug_get_num_option("LIMA_CTX_NUM_PLB", LIMA_CTX_PLB_DEF_NUM);
if (lima_ctx_num_plb > LIMA_CTX_PLB_MAX_NUM ||
lima_ctx_num_plb < LIMA_CTX_PLB_MIN_NUM) {
"reset to default 0\n", lima_ppir_force_spilling);
lima_ppir_force_spilling = 0;
}
+
+ lima_plb_pp_stream_cache_size = debug_get_num_option("LIMA_PLB_PP_STREAM_CACHE_SIZE", 0);
+ if (lima_plb_pp_stream_cache_size < 0) {
+ fprintf(stderr, "lima: LIMA_PLB_PP_STREAM_CACHE_SIZE %d less than 0, "
+ "reset to default 0\n", lima_plb_pp_stream_cache_size);
+ lima_plb_pp_stream_cache_size = 0;
+ }
}
struct pipe_screen *
lima_screen_create(int fd, struct renderonly *ro)
{
+ uint64_t system_memory;
struct lima_screen *screen;
screen = rzalloc(NULL, struct lima_screen);
lima_screen_parse_env();
+ /* Limit PP PLB stream cache size to 0.1% of system memory */
+ if (!lima_plb_pp_stream_cache_size &&
+ os_get_total_physical_memory(&system_memory))
+ lima_plb_pp_stream_cache_size = system_memory >> 10;
+
+ /* Set lower limit on PP PLB cache size */
+ lima_plb_pp_stream_cache_size = MAX2(128 * 1024 * lima_ctx_num_plb,
+ lima_plb_pp_stream_cache_size);
+
if (!lima_screen_query_info(screen))
goto err_out0;