wineandroid: Add helper functions to encapsulate gralloc functionality.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
a4fbe12f97
commit
18ac6bf41a
|
@ -88,6 +88,7 @@ enum android_window_messages
|
|||
WM_ANDROID_REFRESH = 0x80001000,
|
||||
};
|
||||
|
||||
extern void init_gralloc( const struct hw_module_t *module ) DECLSPEC_HIDDEN;
|
||||
extern HWND get_capture_window(void) DECLSPEC_HIDDEN;
|
||||
extern void init_monitors( int width, int height ) DECLSPEC_HIDDEN;
|
||||
extern void set_screen_dpi( DWORD dpi ) DECLSPEC_HIDDEN;
|
||||
|
@ -155,6 +156,4 @@ int send_event( const union event_data *data );
|
|||
extern JavaVM *wine_get_java_vm(void);
|
||||
extern jobject wine_get_java_object(void);
|
||||
|
||||
extern struct gralloc_module_t *gralloc_module;
|
||||
|
||||
#endif /* __WINE_ANDROID_H */
|
||||
|
|
|
@ -212,6 +212,8 @@ struct ioctl_android_set_capture
|
|||
struct ioctl_header hdr;
|
||||
};
|
||||
|
||||
static struct gralloc_module_t *gralloc_module;
|
||||
|
||||
static inline BOOL is_in_desktop_process(void)
|
||||
{
|
||||
return thread != NULL;
|
||||
|
@ -496,6 +498,44 @@ void register_native_window( HWND hwnd, struct ANativeWindow *win, BOOL opengl )
|
|||
NtQueueApcThread( thread, register_native_window_callback, (ULONG_PTR)hwnd, (ULONG_PTR)win, opengl );
|
||||
}
|
||||
|
||||
void init_gralloc( const struct hw_module_t *module )
|
||||
{
|
||||
TRACE( "got module %p ver %u.%u id %s name %s author %s\n",
|
||||
module, module->module_api_version >> 8, module->module_api_version & 0xff,
|
||||
debugstr_a(module->id), debugstr_a(module->name), debugstr_a(module->author) );
|
||||
|
||||
gralloc_module = (struct gralloc_module_t *)module;
|
||||
}
|
||||
|
||||
static int gralloc_grab_buffer( struct ANativeWindowBuffer *buffer )
|
||||
{
|
||||
if (gralloc_module)
|
||||
return gralloc_module->registerBuffer( gralloc_module, buffer->handle );
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static void gralloc_release_buffer( struct ANativeWindowBuffer *buffer )
|
||||
{
|
||||
if (gralloc_module) gralloc_module->unregisterBuffer( gralloc_module, buffer->handle );
|
||||
close_native_handle( (native_handle_t *)buffer->handle );
|
||||
}
|
||||
|
||||
static int gralloc_lock( struct ANativeWindowBuffer *buffer, void **bits )
|
||||
{
|
||||
if (gralloc_module)
|
||||
return gralloc_module->lock( gralloc_module, buffer->handle,
|
||||
GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
|
||||
0, 0, buffer->width, buffer->height, bits );
|
||||
|
||||
*bits = ((struct native_buffer_wrapper *)buffer)->bits;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void gralloc_unlock( struct ANativeWindowBuffer *buffer )
|
||||
{
|
||||
if (gralloc_module) gralloc_module->unlock( gralloc_module, buffer->handle );
|
||||
}
|
||||
|
||||
/* get the capture window stored in the desktop process */
|
||||
HWND get_capture_window(void)
|
||||
{
|
||||
|
@ -740,12 +780,10 @@ static NTSTATUS queueBuffer_ioctl( void *data, DWORD in_size, DWORD out_size, UL
|
|||
if (win_data->mappings[res->buffer_id])
|
||||
{
|
||||
void *bits;
|
||||
int ret = gralloc_module->lock( gralloc_module, buffer->handle,
|
||||
GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
|
||||
0, 0, buffer->width, buffer->height, &bits );
|
||||
ret = gralloc_lock( buffer, &bits );
|
||||
if (ret) return android_error_to_status( ret );
|
||||
memcpy( bits, win_data->mappings[res->buffer_id], buffer->stride * buffer->height * 4 );
|
||||
gralloc_module->unlock( gralloc_module, buffer->handle );
|
||||
gralloc_unlock( buffer );
|
||||
}
|
||||
wrap_java_call();
|
||||
ret = parent->queueBuffer( parent, buffer, -1 );
|
||||
|
@ -1084,11 +1122,7 @@ static void buffer_decRef( struct android_native_base_t *base )
|
|||
|
||||
if (!InterlockedDecrement( &buffer->ref ))
|
||||
{
|
||||
if (!is_in_desktop_process())
|
||||
{
|
||||
if (gralloc_module) gralloc_module->unregisterBuffer( gralloc_module, buffer->buffer.handle );
|
||||
close_native_handle( (native_handle_t *)buffer->buffer.handle );
|
||||
}
|
||||
if (!is_in_desktop_process()) gralloc_release_buffer( &buffer->buffer );
|
||||
if (buffer->bits) UnmapViewOfFile( buffer->bits );
|
||||
HeapFree( GetProcessHeap(), 0, buffer );
|
||||
}
|
||||
|
@ -1140,8 +1174,9 @@ static int dequeueBuffer( struct ANativeWindow *window, struct ANativeWindowBuff
|
|||
}
|
||||
else if (!is_in_desktop_process())
|
||||
{
|
||||
if ((ret = gralloc_module->registerBuffer( gralloc_module, buf->buffer.handle )) < 0)
|
||||
WARN( "hwnd %p, buffer %p failed to register %d %s\n", win->hwnd, &buf->buffer, ret, strerror(-ret) );
|
||||
if ((ret = gralloc_grab_buffer( &buf->buffer )) < 0)
|
||||
WARN( "hwnd %p, buffer %p failed to register %d %s\n",
|
||||
win->hwnd, &buf->buffer, ret, strerror(-ret) );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1313,18 +1348,11 @@ static int perform( ANativeWindow *window, int operation, ... )
|
|||
int ret = window->dequeueBuffer_DEPRECATED( window, &buffer );
|
||||
if (!ret)
|
||||
{
|
||||
if (gralloc_module)
|
||||
if ((ret = gralloc_lock( buffer, &buffer_ret->bits )))
|
||||
{
|
||||
if ((ret = gralloc_module->lock( gralloc_module, buffer->handle,
|
||||
GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
|
||||
0, 0, buffer->width, buffer->height, &buffer_ret->bits )))
|
||||
{
|
||||
WARN( "gralloc->lock %p failed %d %s\n", win->hwnd, ret, strerror(-ret) );
|
||||
window->cancelBuffer( window, buffer, -1 );
|
||||
}
|
||||
WARN( "gralloc->lock %p failed %d %s\n", win->hwnd, ret, strerror(-ret) );
|
||||
window->cancelBuffer( window, buffer, -1 );
|
||||
}
|
||||
else
|
||||
buffer_ret->bits = ((struct native_buffer_wrapper *)buffer)->bits;
|
||||
}
|
||||
if (!ret)
|
||||
{
|
||||
|
@ -1350,7 +1378,7 @@ static int perform( ANativeWindow *window, int operation, ... )
|
|||
int ret = -EINVAL;
|
||||
if (win->locked_buffer)
|
||||
{
|
||||
if (gralloc_module) gralloc_module->unlock( gralloc_module, win->locked_buffer->handle );
|
||||
gralloc_unlock( win->locked_buffer );
|
||||
ret = window->queueBuffer( window, win->locked_buffer, -1 );
|
||||
win->locked_buffer = NULL;
|
||||
}
|
||||
|
|
|
@ -450,8 +450,6 @@ DECL_FUNCPTR( ANativeWindow_fromSurface );
|
|||
DECL_FUNCPTR( ANativeWindow_release );
|
||||
DECL_FUNCPTR( hw_get_module );
|
||||
|
||||
struct gralloc_module_t *gralloc_module = NULL;
|
||||
|
||||
#ifndef DT_GNU_HASH
|
||||
#define DT_GNU_HASH 0x6ffffef5
|
||||
#endif
|
||||
|
@ -564,6 +562,7 @@ static int enum_libs( struct dl_phdr_info* info, size_t size, void* data )
|
|||
static void load_hardware_libs(void)
|
||||
{
|
||||
const struct hw_module_t *module;
|
||||
int ret;
|
||||
void *libhardware;
|
||||
char error[256];
|
||||
|
||||
|
@ -589,10 +588,13 @@ static void load_hardware_libs(void)
|
|||
}
|
||||
}
|
||||
|
||||
if (phw_get_module( GRALLOC_HARDWARE_MODULE_ID, &module ) == 0)
|
||||
gralloc_module = (struct gralloc_module_t *)module;
|
||||
else
|
||||
ERR( "failed to load gralloc module\n" );
|
||||
if ((ret = phw_get_module( GRALLOC_HARDWARE_MODULE_ID, &module )))
|
||||
{
|
||||
ERR( "failed to load gralloc module err %d\n", ret );
|
||||
return;
|
||||
}
|
||||
|
||||
init_gralloc( module );
|
||||
}
|
||||
|
||||
static void load_android_libs(void)
|
||||
|
|
Loading…
Reference in New Issue