Changeset 2ab8ab3 in mainline for uspace/lib/ipcgfx


Ignore:
Timestamp:
2021-02-16T18:12:05Z (5 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
68a552f
Parents:
ef734b7
Message:

Client-side UI rendering

It is possible to turn on and off and if turned on, one can also
enable or disable window double buffering (currently both options
are build-time).

Location:
uspace/lib/ipcgfx
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ipcgfx/include/ipcgfx/ipc/gc.h

    ref734b7 r2ab8ab3  
    11/*
    2  * Copyright (c) 2019 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4141        GC_SET_RGB_COLOR = IPC_FIRST_USER_METHOD,
    4242        GC_FILL_RECT,
     43        GC_UPDATE,
    4344        GC_BITMAP_CREATE,
    4445        GC_BITMAP_CREATE_DOUTPUT,
    4546        GC_BITMAP_DESTROY,
    4647        GC_BITMAP_RENDER,
    47         GC_BITMAP_GET_ALLOC
     48        GC_BITMAP_GET_ALLOC,
    4849} gc_request_t;
    4950
  • uspace/lib/ipcgfx/src/client.c

    ref734b7 r2ab8ab3  
    11/*
    2  * Copyright (c) 2019 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4747static errno_t ipc_gc_set_color(void *, gfx_color_t *);
    4848static errno_t ipc_gc_fill_rect(void *, gfx_rect_t *);
     49static errno_t ipc_gc_update(void *);
    4950static errno_t ipc_gc_bitmap_create(void *, gfx_bitmap_params_t *,
    5051    gfx_bitmap_alloc_t *, void **);
     
    5657        .set_color = ipc_gc_set_color,
    5758        .fill_rect = ipc_gc_fill_rect,
     59        .update = ipc_gc_update,
    5860        .bitmap_create = ipc_gc_bitmap_create,
    5961        .bitmap_destroy = ipc_gc_bitmap_destroy,
     
    103105        rc = async_req_4_0(exch, GC_FILL_RECT, rect->p0.x, rect->p0.y,
    104106            rect->p1.x, rect->p1.y);
     107        async_exchange_end(exch);
     108
     109        return rc;
     110}
     111
     112/** Update display on IPC GC.
     113 *
     114 * @param arg IPC GC
     115 *
     116 * @return EOK on success or an error code
     117 */
     118static errno_t ipc_gc_update(void *arg)
     119{
     120        ipc_gc_t *ipcgc = (ipc_gc_t *) arg;
     121        async_exch_t *exch;
     122        errno_t rc;
     123
     124        exch = async_exchange_begin(ipcgc->sess);
     125        rc = async_req_0_0(exch, GC_UPDATE);
    105126        async_exchange_end(exch);
    106127
  • uspace/lib/ipcgfx/src/server.c

    ref734b7 r2ab8ab3  
    11/*
    2  * Copyright (c) 2019 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    8686}
    8787
     88static void gc_update_srv(ipc_gc_srv_t *srvgc, ipc_call_t *call)
     89{
     90        errno_t rc;
     91
     92        rc = gfx_update(srvgc->gc);
     93        async_answer_0(call, rc);
     94}
     95
    8896static void gc_bitmap_create_srv(ipc_gc_srv_t *srvgc, ipc_call_t *icall)
    8997{
     
    358366                case GC_FILL_RECT:
    359367                        gc_fill_rect_srv(&srvgc, &call);
     368                        break;
     369                case GC_UPDATE:
     370                        gc_update_srv(&srvgc, &call);
    360371                        break;
    361372                case GC_BITMAP_CREATE:
  • uspace/lib/ipcgfx/test/ipcgfx.c

    ref734b7 r2ab8ab3  
    11/*
    2  * Copyright (c) 2019 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    5252static errno_t test_gc_set_color(void *, gfx_color_t *);
    5353static errno_t test_gc_fill_rect(void *, gfx_rect_t *);
     54static errno_t test_gc_update(void *);
    5455static errno_t test_gc_bitmap_create(void *, gfx_bitmap_params_t *,
    5556    gfx_bitmap_alloc_t *, void **);
     
    6162        .set_color = test_gc_set_color,
    6263        .fill_rect = test_gc_fill_rect,
     64        .update = test_gc_update,
    6365        .bitmap_create = test_gc_bitmap_create,
    6466        .bitmap_destroy = test_gc_bitmap_destroy,
     
    8082        bool fill_rect_called;
    8183        gfx_rect_t fill_rect_rect;
     84
     85        bool update_called;
    8286
    8387        bool bitmap_create_called;
     
    292296        PCUT_ASSERT_EQUALS(rect.p1.x, resp.fill_rect_rect.p1.x);
    293297        PCUT_ASSERT_EQUALS(rect.p1.y, resp.fill_rect_rect.p1.y);
     298
     299        ipc_gc_delete(ipcgc);
     300        async_hangup(sess);
     301
     302        rc = loc_service_unregister(sid);
     303        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     304}
     305
     306/** gfx_update with server returning failure */
     307PCUT_TEST(update_failure)
     308{
     309        errno_t rc;
     310        service_id_t sid;
     311        test_response_t resp;
     312        gfx_context_t *gc;
     313        async_sess_t *sess;
     314        ipc_gc_t *ipcgc;
     315
     316        async_set_fallback_port_handler(test_ipcgc_conn, &resp);
     317
     318        // FIXME This causes this test to be non-reentrant!
     319        rc = loc_server_register(test_ipcgfx_server);
     320        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     321
     322        rc = loc_service_register(test_ipcgfx_svc, &sid);
     323        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     324
     325        sess = loc_service_connect(sid, INTERFACE_GC, 0);
     326        PCUT_ASSERT_NOT_NULL(sess);
     327
     328        rc = ipc_gc_create(sess, &ipcgc);
     329        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     330
     331        gc = ipc_gc_get_ctx(ipcgc);
     332        PCUT_ASSERT_NOT_NULL(gc);
     333
     334        resp.rc = ENOMEM;
     335        resp.update_called = false;
     336        rc = gfx_update(gc);
     337        PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
     338        PCUT_ASSERT_TRUE(resp.update_called);
     339
     340        ipc_gc_delete(ipcgc);
     341        async_hangup(sess);
     342
     343        rc = loc_service_unregister(sid);
     344        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     345}
     346
     347/** gfx_update with server returning success */
     348PCUT_TEST(update_success)
     349{
     350        errno_t rc;
     351        service_id_t sid;
     352        test_response_t resp;
     353        gfx_context_t *gc;
     354        async_sess_t *sess;
     355        ipc_gc_t *ipcgc;
     356
     357        async_set_fallback_port_handler(test_ipcgc_conn, &resp);
     358
     359        // FIXME This causes this test to be non-reentrant!
     360        rc = loc_server_register(test_ipcgfx_server);
     361        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     362
     363        rc = loc_service_register(test_ipcgfx_svc, &sid);
     364        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     365
     366        sess = loc_service_connect(sid, INTERFACE_GC, 0);
     367        PCUT_ASSERT_NOT_NULL(sess);
     368
     369        rc = ipc_gc_create(sess, &ipcgc);
     370        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     371
     372        gc = ipc_gc_get_ctx(ipcgc);
     373        PCUT_ASSERT_NOT_NULL(gc);
     374
     375        resp.rc = EOK;
     376        resp.update_called = false;
     377        rc = gfx_update(gc);
     378        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     379        PCUT_ASSERT_TRUE(resp.update_called);
    294380
    295381        ipc_gc_delete(ipcgc);
     
    847933}
    848934
     935/** Update test GC.
     936 *
     937 * @param arg Test GC
     938 *
     939 * @return EOK on success or an error code
     940 */
     941static errno_t test_gc_update(void *arg)
     942{
     943        test_response_t *resp = (test_response_t *) arg;
     944
     945        resp->update_called = true;
     946        return resp->rc;
     947}
     948
    849949/** Create bitmap in test GC.
    850950 *
Note: See TracChangeset for help on using the changeset viewer.