Changeset 68a552f in mainline for uspace/lib/c/generic/io/con_srv.c


Ignore:
Timestamp:
2021-02-22T19:52:08Z (4 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
26853ebc
Parents:
2ab8ab3
Message:

Efficient way of rendering to the console via shared buffer

Makes congfx reasonably fast

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/io/con_srv.c

    r2ab8ab3 r68a552f  
    11/*
    2  * Copyright (c) 2012 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3434 * @brief Console protocol server stub
    3535 */
     36#include <as.h>
    3637#include <errno.h>
    3738#include <io/cons_event.h>
     
    307308}
    308309
     310/** Create shared buffer for efficient rendering */
     311static void con_map_srv(con_srv_t *srv, ipc_call_t *icall)
     312{
     313        errno_t rc;
     314        charfield_t *buf;
     315        sysarg_t cols, rows;
     316        ipc_call_t call;
     317        size_t size;
     318
     319        if (srv->srvs->ops->map == NULL || srv->srvs->ops->unmap == NULL) {
     320                async_answer_0(icall, ENOTSUP);
     321                return;
     322        }
     323
     324        cols = ipc_get_arg1(icall);
     325        rows = ipc_get_arg2(icall);
     326
     327        if (!async_share_in_receive(&call, &size)) {
     328                async_answer_0(icall, EINVAL);
     329                return;
     330        }
     331
     332        /* Check size */
     333        if (size != PAGES2SIZE(SIZE2PAGES(cols * rows * sizeof(charfield_t)))) {
     334                async_answer_0(&call, EINVAL);
     335                async_answer_0(icall, EINVAL);
     336                return;
     337        }
     338
     339        rc = srv->srvs->ops->map(srv, cols, rows, &buf);
     340        if (rc != EOK) {
     341                async_answer_0(&call, rc);
     342                async_answer_0(icall, rc);
     343                return;
     344        }
     345
     346        rc = async_share_in_finalize(&call, buf, AS_AREA_READ |
     347            AS_AREA_WRITE | AS_AREA_CACHEABLE);
     348        if (rc != EOK) {
     349                srv->srvs->ops->unmap(srv);
     350                async_answer_0(icall, EIO);
     351                return;
     352        }
     353
     354        async_answer_0(icall, EOK);
     355}
     356
     357/** Delete shared buffer */
     358static void con_unmap_srv(con_srv_t *srv, ipc_call_t *icall)
     359{
     360        if (srv->srvs->ops->unmap == NULL) {
     361                async_answer_0(icall, ENOTSUP);
     362                return;
     363        }
     364
     365        srv->srvs->ops->unmap(srv);
     366        async_answer_0(icall, EOK);
     367}
     368
     369/** Update console area from shared buffer */
     370static void con_update_srv(con_srv_t *srv, ipc_call_t *icall)
     371{
     372        sysarg_t c0, r0, c1, r1;
     373
     374        c0 = ipc_get_arg1(icall);
     375        r0 = ipc_get_arg2(icall);
     376        c1 = ipc_get_arg3(icall);
     377        r1 = ipc_get_arg4(icall);
     378
     379        if (srv->srvs->ops->update == NULL) {
     380                async_answer_0(icall, ENOTSUP);
     381                return;
     382        }
     383
     384        srv->srvs->ops->update(srv, c0, r0, c1, r1);
     385        async_answer_0(icall, EOK);
     386}
     387
    309388static con_srv_t *con_srv_create(con_srvs_t *srvs)
    310389{
     
    412491                        con_get_event_srv(srv, &call);
    413492                        break;
     493                case CONSOLE_MAP:
     494                        con_map_srv(srv, &call);
     495                        break;
     496                case CONSOLE_UNMAP:
     497                        con_unmap_srv(srv, &call);
     498                        break;
     499                case CONSOLE_UPDATE:
     500                        con_update_srv(srv, &call);
     501                        break;
    414502                default:
    415503                        async_answer_0(&call, ENOTSUP);
Note: See TracChangeset for help on using the changeset viewer.