From: Twaik Yont <9674930+twaik@users.noreply.github.com> Route ioctl dispatch related logging in device.c through __android_log_print and map WINEDEBUG levels to Android log priorities. Initialize a per-module verbosity level from the Wine debug channel and use it to filter logcat output, preserving the effective debug level without relying on Wine debug macros at call sites. This prepares the ioctl dispatch path for execution outside of the Wine context (e.g. on the Android activity thread), where the standard Wine debug infrastructure is not available. Signed-off-by: Twaik Yont <9674930+twaik@users.noreply.github.com> --- dlls/wineandroid.drv/android.h | 1 + dlls/wineandroid.drv/device.c | 89 ++++++++++++++++++++++++---------- dlls/wineandroid.drv/init.c | 1 + 3 files changed, 66 insertions(+), 25 deletions(-) diff --git a/dlls/wineandroid.drv/android.h b/dlls/wineandroid.drv/android.h index 3107136cb7e..773c602514f 100644 --- a/dlls/wineandroid.drv/android.h +++ b/dlls/wineandroid.drv/android.h @@ -119,6 +119,7 @@ enum android_window_messages WM_ANDROID_REFRESH = WM_WINE_FIRST_DRIVER_MSG, }; +extern void init_android_log_verbosity(void); extern void init_ahardwarebuffers(void); extern HWND get_capture_window(void); extern void init_monitors( int width, int height ); diff --git a/dlls/wineandroid.drv/device.c b/dlls/wineandroid.drv/device.c index b3a502bd5cc..da73298fd72 100644 --- a/dlls/wineandroid.drv/device.c +++ b/dlls/wineandroid.drv/device.c @@ -48,6 +48,45 @@ WINE_DEFAULT_DEBUG_CHANNEL(android); +static int android_log_verbosity = ANDROID_LOG_VERBOSE; + +void init_android_log_verbosity(void) +{ + struct __wine_debug_channel *ch = &__wine_dbch_android; + + if (__WINE_IS_DEBUG_ON(_TRACE, ch)) + android_log_verbosity = ANDROID_LOG_VERBOSE; + else if (__WINE_IS_DEBUG_ON(_FIXME, ch)) + android_log_verbosity = ANDROID_LOG_WARN; + else if (__WINE_IS_DEBUG_ON(_WARN, ch)) + android_log_verbosity = ANDROID_LOG_WARN; + else if (__WINE_IS_DEBUG_ON(_ERR, ch)) + android_log_verbosity = ANDROID_LOG_ERROR; + else + android_log_verbosity = ANDROID_LOG_SILENT; +} + +#define __LOG(prio, ...) \ + do { if ((ANDROID_LOG_ ## prio) >= android_log_verbosity) \ + p__android_log_print( ANDROID_LOG_ ## prio, "wine", __VA_ARGS__ ); } while (0) +#define _INFO(...) __LOG(INFO, __VA_ARGS__) +#define _DEBUG(...) __LOG(DEBUG, __VA_ARGS__) +#define _WARN(...) __LOG(WARN, __VA_ARGS__) +#define _FIXME(...) __LOG(WARN, "FIXME: " __VA_ARGS__) +#define _TRACE(...) __LOG(VERBOSE, __VA_ARGS__) +#define _ERR(...) __LOG(ERROR, __VA_ARGS__) +static inline const char *_wine_dbgstr_rect( const RECT *rect ) +{ + enum { N = 4 }; + static __thread char buf[N][64]; + static __thread int idx; + char *ret = buf[idx++ % N]; + + if (!rect) return "(null)"; + snprintf( ret, 64, "(%d,%d)-(%d,%d)", (int)rect->left, (int)rect->top, (int)rect->right, (int)rect->bottom ); + return ret; +} + #define DECL_FUNCPTR(f) static typeof(f) * p##f = NULL struct AHardwareBuffer* ANativeWindowBuffer_getHardwareBuffer(struct ANativeWindowBuffer* anwb) __INTRODUCED_IN(26); @@ -275,7 +314,7 @@ static struct native_win_data *get_native_win_data( HWND hwnd, BOOL opengl ) struct native_win_data *data = data_map[data_map_idx( hwnd, opengl )]; if (data && data->hwnd == hwnd && !data->opengl == !opengl) return data; - WARN( "unknown win %p opengl %u\n", hwnd, opengl ); + _WARN( "unknown win %p opengl %u\n", hwnd, opengl ); return NULL; } @@ -375,7 +414,7 @@ static int register_buffer( struct native_win_data *win, struct AHardwareBuffer i = win->buffer_lru[NB_CACHED_BUFFERS - 1]; assert( i < NB_CACHED_BUFFERS ); - TRACE( "%p %p evicting buffer %p id %d from cache\n", + _TRACE( "%p %p evicting buffer %p id %d from cache\n", win->hwnd, win->parent, win->buffers[i], i ); pAHardwareBuffer_release(win->buffers[i]); } @@ -384,7 +423,7 @@ static int register_buffer( struct native_win_data *win, struct AHardwareBuffer pAHardwareBuffer_acquire(buffer); *is_new = 1; - TRACE( "%p %p %p -> %d\n", win->hwnd, win->parent, buffer, i ); + _TRACE( "%p %p %p -> %d\n", win->hwnd, win->parent, buffer, i ); done: insert_buffer_lru( win, i ); @@ -395,7 +434,7 @@ static struct ANativeWindowBuffer *get_registered_buffer( struct native_win_data { if (id < 0 || id >= NB_CACHED_BUFFERS || !win->buffers[id]) { - ERR( "unknown buffer %d for %p %p\n", id, win->hwnd, win->parent ); + _ERR( "unknown buffer %d for %p %p\n", id, win->hwnd, win->parent ); return NULL; } return anwb_from_ahb(win->buffers[id]); @@ -431,7 +470,7 @@ static struct native_win_data *create_native_win_data( HWND hwnd, BOOL opengl ) if (data) { - WARN( "data for %p not freed correctly\n", data->hwnd ); + _WARN( "data for %p not freed correctly\n", data->hwnd ); free_native_win_data( data ); } if (!(data = calloc( 1, sizeof(*data) ))) return NULL; @@ -458,7 +497,7 @@ NTSTATUS android_register_window( void *arg ) { pANativeWindow_release( win ); if (data) NtUserPostMessage( hwnd, WM_ANDROID_REFRESH, opengl, 0 ); - TRACE( "%p -> %p win %p (unchanged)\n", hwnd, data, win ); + _TRACE( "%p -> %p win %p (unchanged)\n", hwnd, data, win ); return 0; } @@ -471,7 +510,7 @@ NTSTATUS android_register_window( void *arg ) win->setSwapInterval( win, data->swap_interval ); unwrap_java_call(); NtUserPostMessage( hwnd, WM_ANDROID_REFRESH, opengl, 0 ); - TRACE( "%p -> %p win %p\n", hwnd, data, win ); + _TRACE( "%p -> %p win %p\n", hwnd, data, win ); return 0; } @@ -537,7 +576,7 @@ static NTSTATUS android_error_to_status( int err ) case -EBADMSG: return STATUS_INVALID_DEVICE_REQUEST; case -EWOULDBLOCK: return STATUS_DEVICE_NOT_READY; default: - FIXME( "unmapped error %d\n", err ); + _FIXME( "unmapped error %d\n", err ); return STATUS_UNSUCCESSFUL; } } @@ -561,7 +600,7 @@ static int status_to_android_error( unsigned int status ) case STATUS_INVALID_DEVICE_REQUEST: return -EBADMSG; case STATUS_DEVICE_NOT_READY: return -EWOULDBLOCK; default: - FIXME( "unmapped status %08x\n", status ); + _FIXME( "unmapped status %08x\n", status ); return -EINVAL; } } @@ -580,7 +619,7 @@ static jobject load_java_method( jmethodID *method, const char *name, const char unwrap_java_call(); if (!*method) { - FIXME( "method %s not found\n", name ); + _FIXME( "method %s not found\n", name ); return NULL; } } @@ -611,7 +650,7 @@ static NTSTATUS createWindow_ioctl( void *data, DWORD in_size, DWORD out_size, U if (!(win_data = create_native_win_data( LongToHandle(res->hdr.hwnd), res->hdr.opengl ))) return STATUS_NO_MEMORY; - TRACE( "hwnd %08x opengl %u parent %08x\n", res->hdr.hwnd, res->hdr.opengl, res->parent ); + _TRACE( "hwnd %08x opengl %u parent %08x\n", res->hdr.hwnd, res->hdr.opengl, res->parent ); if (!(object = load_java_method( &method, "createWindow", "(IZZIF)V" ))) return STATUS_NOT_SUPPORTED; @@ -632,7 +671,7 @@ static NTSTATUS destroyWindow_ioctl( void *data, DWORD in_size, DWORD out_size, win_data = get_ioctl_native_win_data( &res->hdr ); - TRACE( "hwnd %08x opengl %u\n", res->hdr.hwnd, res->hdr.opengl ); + _TRACE( "hwnd %08x opengl %u\n", res->hdr.hwnd, res->hdr.opengl ); if (!(object = load_java_method( &method, "destroyWindow", "(I)V" ))) return STATUS_NOT_SUPPORTED; @@ -651,9 +690,9 @@ static NTSTATUS windowPosChanged_ioctl( void *data, DWORD in_size, DWORD out_siz if (in_size < sizeof(*res)) return STATUS_INVALID_PARAMETER; - TRACE( "hwnd %08x win %s client %s visible %s style %08x flags %08x after %08x owner %08x\n", - res->hdr.hwnd, wine_dbgstr_rect(&res->window_rect), wine_dbgstr_rect(&res->client_rect), - wine_dbgstr_rect(&res->visible_rect), res->style, res->flags, res->after, res->owner ); + _TRACE( "hwnd %08x win %s client %s visible %s style %08x flags %08x after %08x owner %08x\n", + res->hdr.hwnd, _wine_dbgstr_rect(&res->window_rect), _wine_dbgstr_rect(&res->client_rect), + _wine_dbgstr_rect(&res->visible_rect), res->style, res->flags, res->after, res->owner ); if (!(object = load_java_method( &method, "windowPosChanged", "(IIIIIIIIIIIIIIIII)V" ))) return STATUS_NOT_SUPPORTED; @@ -692,17 +731,17 @@ static NTSTATUS dequeueBuffer_ioctl( void *data, DWORD in_size, DWORD out_size, unwrap_java_call(); if (ret) { - ERR( "%08x failed %d\n", res->hdr.hwnd, ret ); + _ERR( "%08x failed %d\n", res->hdr.hwnd, ret ); return android_error_to_status( ret ); } if (!buffer) { - TRACE( "got invalid buffer\n" ); + _TRACE( "got invalid buffer\n" ); return STATUS_UNSUCCESSFUL; } - TRACE( "%08x got buffer %p fence %d\n", res->hdr.hwnd, buffer, fence ); + _TRACE( "%08x got buffer %p fence %d\n", res->hdr.hwnd, buffer, fence ); ahb = pANativeWindowBuffer_getHardwareBuffer( buffer ); res->buffer_id = register_buffer( win_data, ahb, &is_new ); @@ -782,7 +821,7 @@ static NTSTATUS cancelBuffer_ioctl( void *data, DWORD in_size, DWORD out_size, U if (!(buffer = get_registered_buffer( win_data, res->buffer_id ))) return STATUS_INVALID_HANDLE; - TRACE( "%08x buffer %p\n", res->hdr.hwnd, buffer ); + _TRACE( "%08x buffer %p\n", res->hdr.hwnd, buffer ); wrap_java_call(); ret = parent->cancelBuffer( parent, buffer, -1 ); unwrap_java_call(); @@ -805,7 +844,7 @@ static NTSTATUS queueBuffer_ioctl( void *data, DWORD in_size, DWORD out_size, UL if (!(buffer = get_registered_buffer( win_data, res->buffer_id ))) return STATUS_INVALID_HANDLE; - TRACE( "%08x buffer %p\n", res->hdr.hwnd, buffer ); + _TRACE( "%08x buffer %p\n", res->hdr.hwnd, buffer ); wrap_java_call(); ret = parent->queueBuffer( parent, buffer, -1 ); unwrap_java_call(); @@ -913,7 +952,7 @@ static NTSTATUS perform_ioctl( void *data, DWORD in_size, DWORD out_size, ULONG_ } case NATIVE_WINDOW_LOCK: default: - FIXME( "unsupported perform op %d\n", res->operation ); + _FIXME( "unsupported perform op %d\n", res->operation ); break; } return android_error_to_status( ret ); @@ -949,7 +988,7 @@ static NTSTATUS setWindowParent_ioctl( void *data, DWORD in_size, DWORD out_size if (!(win_data = get_ioctl_native_win_data( &res->hdr ))) return STATUS_INVALID_HANDLE; - TRACE( "hwnd %08x parent %08x\n", res->hdr.hwnd, res->parent ); + _TRACE( "hwnd %08x parent %08x\n", res->hdr.hwnd, res->parent ); if (!(object = load_java_method( &method, "setParent", "(IIF)V" ))) return STATUS_NOT_SUPPORTED; @@ -967,7 +1006,7 @@ static NTSTATUS setCapture_ioctl( void *data, DWORD in_size, DWORD out_size, ULO if (res->hdr.hwnd && !get_ioctl_native_win_data( &res->hdr )) return STATUS_INVALID_HANDLE; - TRACE( "hwnd %08x\n", res->hdr.hwnd ); + _TRACE( "hwnd %08x\n", res->hdr.hwnd ); InterlockedExchangePointer( (void **)&capture_window, LongToHandle( res->hdr.hwnd )); return STATUS_SUCCESS; @@ -989,7 +1028,7 @@ static NTSTATUS setCursor_ioctl( void *data, DWORD in_size, DWORD out_size, ULON if (in_size != offsetof( struct ioctl_android_set_cursor, bits[size] )) return STATUS_INVALID_PARAMETER; - TRACE( "hwnd %08x size %d\n", res->hdr.hwnd, size ); + _TRACE( "hwnd %08x size %d\n", res->hdr.hwnd, size ); if (!(object = load_java_method( &method, "setCursor", "(IIIII[I)V" ))) return STATUS_NOT_SUPPORTED; @@ -1051,7 +1090,7 @@ NTSTATUS android_dispatch_ioctl( void *arg ) } else { - FIXME( "ioctl %x not supported\n", irpsp->Parameters.DeviceIoControl.IoControlCode ); + _FIXME( "ioctl %x not supported\n", irpsp->Parameters.DeviceIoControl.IoControlCode ); irp->IoStatus.Status = STATUS_NOT_SUPPORTED; } return STATUS_SUCCESS; diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index 303655cde58..e8cb360d032 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -386,6 +386,7 @@ static HRESULT android_init( void *arg ) object = *p_java_object; + init_android_log_verbosity(); init_ahardwarebuffers(); pthread_mutexattr_init( &attr ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10569