Changeset afcf704 in mainline for uspace/lib/ipcgfx/src/server.c


Ignore:
Timestamp:
2020-06-14T22:23:34Z (4 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c45d8696
Parents:
28f8f6f2
Message:

Allow GUI direct access to window buffer

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ipcgfx/src/server.c

    r28f8f6f2 rafcf704  
    128128        /* Check size */
    129129        if (size != PAGES2SIZE(SIZE2PAGES(dim.x * dim.y * sizeof(uint32_t)))) {
    130                 printf("size=%zu, expected=%zu\n", size, dim.x * dim.y * sizeof(uint32_t));
    131130                async_answer_0(icall, EINVAL);
    132131                return;
     
    168167}
    169168
     169static void gc_bitmap_create_doutput_srv(ipc_gc_srv_t *srvgc, ipc_call_t *icall)
     170{
     171        gfx_bitmap_params_t params;
     172        gfx_bitmap_alloc_t alloc;
     173        gfx_bitmap_t *bitmap;
     174        gfx_coord2_t dim;
     175        ipc_gc_srv_bitmap_t *srvbmp = NULL;
     176        ipc_call_t call;
     177        size_t size;
     178        errno_t rc;
     179
     180        if (!async_data_write_receive(&call, &size)) {
     181                async_answer_0(&call, EREFUSED);
     182                async_answer_0(icall, EREFUSED);
     183                return;
     184        }
     185
     186        if (size != sizeof(gfx_bitmap_params_t)) {
     187                async_answer_0(&call, EINVAL);
     188                async_answer_0(icall, EINVAL);
     189                return;
     190        }
     191
     192        rc = async_data_write_finalize(&call, &params, size);
     193        if (rc != EOK) {
     194                async_answer_0(&call, rc);
     195                async_answer_0(icall, rc);
     196                return;
     197        }
     198
     199        /* Bitmap dimensions */
     200        gfx_coord2_subtract(&params.rect.p1, &params.rect.p0, &dim);
     201
     202        if (!async_share_in_receive(&call, &size)) {
     203                async_answer_0(icall, EINVAL);
     204                return;
     205        }
     206
     207        /* Check size */
     208        if (size != PAGES2SIZE(SIZE2PAGES(dim.x * dim.y * sizeof(uint32_t)))) {
     209                async_answer_0(&call, EINVAL);
     210                async_answer_0(icall, EINVAL);
     211                return;
     212        }
     213
     214        rc = gfx_bitmap_create(srvgc->gc, &params, NULL, &bitmap);
     215        if (rc != EOK) {
     216                async_answer_0(&call, rc);
     217                async_answer_0(icall, rc);
     218                return;
     219        }
     220
     221        rc = gfx_bitmap_get_alloc(bitmap, &alloc);
     222        if (rc != EOK) {
     223                gfx_bitmap_destroy(bitmap);
     224                async_answer_0(&call, rc);
     225                async_answer_0(icall, rc);
     226                return;
     227        }
     228
     229        rc = async_share_in_finalize(&call, alloc.pixels, AS_AREA_READ |
     230            AS_AREA_WRITE | AS_AREA_CACHEABLE);
     231        if (rc != EOK) {
     232                gfx_bitmap_destroy(bitmap);
     233                async_answer_0(icall, EIO);
     234                return;
     235        }
     236
     237        srvbmp = calloc(1, sizeof(ipc_gc_srv_bitmap_t));
     238        if (srvbmp == NULL) {
     239                gfx_bitmap_destroy(bitmap);
     240                async_answer_0(icall, ENOMEM);
     241                return;
     242        }
     243
     244        srvbmp->srvgc = srvgc;
     245        list_append(&srvbmp->lbitmaps, &srvgc->bitmaps);
     246        srvbmp->bmp = bitmap;
     247        srvbmp->bmp_id = srvgc->next_bmp_id++;
     248        printf("gc_bitmap_create_doutput_srv: storing bmp_id=%u\n",
     249            (unsigned) srvbmp->bmp_id);
     250
     251        async_answer_1(icall, EOK, srvbmp->bmp_id);
     252}
     253
    170254static void gc_bitmap_destroy_srv(ipc_gc_srv_t *srvgc, ipc_call_t *call)
    171255{
     
    270354                        gc_bitmap_create_srv(&srvgc, &call);
    271355                        break;
     356                case GC_BITMAP_CREATE_DOUTPUT:
     357                        gc_bitmap_create_doutput_srv(&srvgc, &call);
     358                        break;
    272359                case GC_BITMAP_DESTROY:
    273360                        gc_bitmap_destroy_srv(&srvgc, &call);
Note: See TracChangeset for help on using the changeset viewer.