mirror of
https://github.com/4jcraft/4jcraft.git
synced 2026-08-20 09:57:10 +00:00
chore(linux): add diagnostics for iggy render-target exhaustion
This commit is contained in:
parent
94a67d41b6
commit
f499eaee9c
|
|
@ -653,6 +653,90 @@ static void RADLINK gdraw_DescribeVertexBuffer(GDrawVertexBuffer *vbuf, GDraw_Ve
|
||||||
// Create/free (or cache) render targets
|
// Create/free (or cache) render targets
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
S32 free_count;
|
||||||
|
S32 live_count;
|
||||||
|
S32 locked_count;
|
||||||
|
S32 dead_count;
|
||||||
|
S32 pinned_count;
|
||||||
|
S32 user_owned_count;
|
||||||
|
S32 alloc_count;
|
||||||
|
} GDrawHandleStateCounts;
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
GDRAW_RT_DIAG_color_memory = 1 << 0,
|
||||||
|
GDRAW_RT_DIAG_color_handles = 1 << 1,
|
||||||
|
GDRAW_RT_DIAG_cache_bitmap = 1 << 2,
|
||||||
|
GDRAW_RT_DIAG_stack_depth = 1 << 3,
|
||||||
|
GDRAW_RT_DIAG_empty_request = 1 << 4,
|
||||||
|
};
|
||||||
|
|
||||||
|
static U32 gdraw_rt_diag_emitted = 0;
|
||||||
|
|
||||||
|
static void gdraw_CountHandleStates(GDrawHandleCache *cache,
|
||||||
|
GDrawHandleStateCounts *counts)
|
||||||
|
{
|
||||||
|
S32 i;
|
||||||
|
counts->free_count = 0;
|
||||||
|
counts->live_count = 0;
|
||||||
|
counts->locked_count = 0;
|
||||||
|
counts->dead_count = 0;
|
||||||
|
counts->pinned_count = 0;
|
||||||
|
counts->user_owned_count = 0;
|
||||||
|
counts->alloc_count = 0;
|
||||||
|
|
||||||
|
if (!cache)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < cache->max_handles; ++i) {
|
||||||
|
switch (cache->handle[i].state) {
|
||||||
|
case GDRAW_HANDLE_STATE_free: ++counts->free_count; break;
|
||||||
|
case GDRAW_HANDLE_STATE_live: ++counts->live_count; break;
|
||||||
|
case GDRAW_HANDLE_STATE_locked: ++counts->locked_count; break;
|
||||||
|
case GDRAW_HANDLE_STATE_dead: ++counts->dead_count; break;
|
||||||
|
case GDRAW_HANDLE_STATE_pinned: ++counts->pinned_count; break;
|
||||||
|
case GDRAW_HANDLE_STATE_user_owned: ++counts->user_owned_count; break;
|
||||||
|
case GDRAW_HANDLE_STATE_alloc: ++counts->alloc_count; break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gdraw_ReportHandleCacheDiag(char const *label,
|
||||||
|
GDrawHandleCache *cache,
|
||||||
|
U32 once_bit,
|
||||||
|
S32 req_w,
|
||||||
|
S32 req_h)
|
||||||
|
{
|
||||||
|
GDrawHandleStateCounts counts;
|
||||||
|
|
||||||
|
if (gdraw_rt_diag_emitted & once_bit)
|
||||||
|
return;
|
||||||
|
gdraw_rt_diag_emitted |= once_bit;
|
||||||
|
|
||||||
|
gdraw_CountHandleStates(cache, &counts);
|
||||||
|
IggyGDrawSendWarning(NULL,
|
||||||
|
"GDraw[%s] diag: frame=%dx%d tile=%dx%d padded=%dx%d req=%dx%d depth=%d bytes_free=%d total_bytes=%d handles free=%d live=%d locked=%d dead=%d pinned=%d user=%d alloc=%d",
|
||||||
|
label,
|
||||||
|
gdraw->frametex_width, gdraw->frametex_height,
|
||||||
|
gdraw->tw, gdraw->th,
|
||||||
|
gdraw->tpw, gdraw->tph,
|
||||||
|
req_w, req_h,
|
||||||
|
(int) (gdraw->cur - gdraw->frame),
|
||||||
|
cache ? cache->bytes_free : 0,
|
||||||
|
cache ? cache->total_bytes : 0,
|
||||||
|
counts.free_count, counts.live_count, counts.locked_count,
|
||||||
|
counts.dead_count, counts.pinned_count, counts.user_owned_count,
|
||||||
|
counts.alloc_count);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define gdraw_ReportHandleCacheDiag(label, cache, once_bit, req_w, req_h) \
|
||||||
|
((void) 0)
|
||||||
|
#endif
|
||||||
|
|
||||||
static GDrawHandle *get_rendertarget_texture(int width, int height, void *owner, GDrawStats *gstats)
|
static GDrawHandle *get_rendertarget_texture(int width, int height, void *owner, GDrawStats *gstats)
|
||||||
{
|
{
|
||||||
S32 size;
|
S32 size;
|
||||||
|
|
@ -696,13 +780,17 @@ static GDrawHandle *get_color_rendertarget(GDrawStats *gstats)
|
||||||
// ran out of RTs, allocate a new one
|
// ran out of RTs, allocate a new one
|
||||||
size = gdraw->frametex_width * gdraw->frametex_height * 4;
|
size = gdraw->frametex_width * gdraw->frametex_height * 4;
|
||||||
if (gdraw->rendertargets.bytes_free < size) {
|
if (gdraw->rendertargets.bytes_free < size) {
|
||||||
IggyGDrawSendWarning(NULL, "GDraw exceeded available rendertarget memory");
|
gdraw_ReportHandleCacheDiag("rt-color-memory", &gdraw->rendertargets,
|
||||||
|
GDRAW_RT_DIAG_color_memory, gdraw->tpw, gdraw->tph);
|
||||||
|
IggyGDrawSendWarning(NULL, "GDraw[rt-color] exceeded available rendertarget memory");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
t = gdraw_HandleCacheAllocateBegin(&gdraw->rendertargets);
|
t = gdraw_HandleCacheAllocateBegin(&gdraw->rendertargets);
|
||||||
if (!t) {
|
if (!t) {
|
||||||
IggyGDrawSendWarning(NULL, "GDraw exceeded available rendertarget handles");
|
gdraw_ReportHandleCacheDiag("rt-color-handles", &gdraw->rendertargets,
|
||||||
|
GDRAW_RT_DIAG_color_handles, gdraw->tpw, gdraw->tph);
|
||||||
|
IggyGDrawSendWarning(NULL, "GDraw[rt-color] exceeded available rendertarget handles");
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1010,25 +1098,31 @@ static rrbool RADLINK gdraw_TextureDrawBufferBegin(gswf_recti *region, gdraw_tex
|
||||||
GDrawHandle *t;
|
GDrawHandle *t;
|
||||||
int k;
|
int k;
|
||||||
if (gdraw->tw == 0 || gdraw->th == 0) {
|
if (gdraw->tw == 0 || gdraw->th == 0) {
|
||||||
IggyGDrawSendWarning(NULL, "GDraw got a request for an empty rendertarget");
|
gdraw_ReportHandleCacheDiag("rt-empty", &gdraw->rendertargets,
|
||||||
|
GDRAW_RT_DIAG_empty_request, region->x1 - region->x0, region->y1 - region->y0);
|
||||||
|
IggyGDrawSendWarning(NULL, "GDraw[rt-stack] got a request for an empty rendertarget");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n >= &gdraw->frame[MAX_RENDER_STACK_DEPTH]) {
|
if (n >= &gdraw->frame[MAX_RENDER_STACK_DEPTH]) {
|
||||||
IggyGDrawSendWarning(NULL, "GDraw rendertarget nesting exceeded MAX_RENDER_STACK_DEPTH");
|
gdraw_ReportHandleCacheDiag("rt-stack-depth", &gdraw->rendertargets,
|
||||||
|
GDRAW_RT_DIAG_stack_depth, region->x1 - region->x0, region->y1 - region->y0);
|
||||||
|
IggyGDrawSendWarning(NULL, "GDraw[rt-stack] rendertarget nesting exceeded MAX_RENDER_STACK_DEPTH");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (owner) {
|
if (owner) {
|
||||||
t = get_rendertarget_texture(region->x1 - region->x0, region->y1 - region->y0, owner, gstats);
|
t = get_rendertarget_texture(region->x1 - region->x0, region->y1 - region->y0, owner, gstats);
|
||||||
if (!t) {
|
if (!t) {
|
||||||
IggyGDrawSendWarning(NULL, "GDraw ran out of rendertargets for cacheAsBItmap");
|
gdraw_ReportHandleCacheDiag("rt-cacheAsBitmap", gdraw->texturecache,
|
||||||
|
GDRAW_RT_DIAG_cache_bitmap, region->x1 - region->x0, region->y1 - region->y0);
|
||||||
|
IggyGDrawSendWarning(NULL, "GDraw[rt-cacheAsBitmap] ran out of rendertargets");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
t = get_color_rendertarget(gstats);
|
t = get_color_rendertarget(gstats);
|
||||||
if (!t) {
|
if (!t) {
|
||||||
IggyGDrawSendWarning(NULL, "GDraw ran out of rendertargets");
|
IggyGDrawSendWarning(NULL, "GDraw[rt-color] ran out of rendertargets");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue