Home | History | Annotate | Download | only in null
      1 /*
      2  * Mesa 3-D graphics library
      3  * Version:  7.12
      4  *
      5  * Copyright (C) 2011 LunarG Inc.
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a
      8  * copy of this software and associated documentation files (the "Software"),
      9  * to deal in the Software without restriction, including without limitation
     10  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     11  * and/or sell copies of the Software, and to permit persons to whom the
     12  * Software is furnished to do so, subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice shall be included
     15  * in all copies or substantial portions of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     22  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     23  * DEALINGS IN THE SOFTWARE.
     24  *
     25  * Authors:
     26  *    Chia-I Wu <olv (at) lunarg.com>
     27  */
     28 
     29 /**
     30  * For NULL window system,
     31  *
     32  *  - the only valid native display is EGL_DEFAULT_DISPLAY
     33  *  - there is no window or pixmap
     34  */
     35 
     36 #include "util/u_memory.h"
     37 #include "null/null_sw_winsys.h"
     38 #include "common/native.h"
     39 
     40 struct null_display {
     41    struct native_display base;
     42 
     43    const struct native_event_handler *event_handler;
     44 
     45    struct native_config *configs;
     46    int num_configs;
     47 };
     48 
     49 static INLINE struct null_display *
     50 null_display(const struct native_display *ndpy)
     51 {
     52    return (struct null_display *) ndpy;
     53 }
     54 
     55 static const struct native_config **
     56 null_display_get_configs(struct native_display *ndpy, int *num_configs)
     57 {
     58    struct null_display *null = null_display(ndpy);
     59    const struct native_config **configs;
     60    int i;
     61 
     62    configs = MALLOC(sizeof(*configs) * null->num_configs);
     63    if (configs) {
     64       for (i = 0; i < null->num_configs; i++)
     65          configs[i] = &null->configs[i];
     66       if (num_configs)
     67          *num_configs = null->num_configs;
     68    }
     69 
     70    return configs;
     71 }
     72 
     73 static int
     74 null_display_get_param(struct native_display *ndpy,
     75                       enum native_param_type param)
     76 {
     77    return 0;
     78 }
     79 
     80 static void
     81 null_display_destroy(struct native_display *ndpy)
     82 {
     83    struct null_display *null = null_display(ndpy);
     84 
     85    FREE(null->configs);
     86    ndpy_uninit(&null->base);
     87    FREE(null);
     88 }
     89 
     90 static boolean
     91 null_display_init_config(struct native_display *ndpy)
     92 {
     93    const enum pipe_format color_formats[] =  {
     94       PIPE_FORMAT_B8G8R8A8_UNORM,
     95       PIPE_FORMAT_B8G8R8X8_UNORM,
     96       PIPE_FORMAT_B5G6R5_UNORM,
     97       PIPE_FORMAT_NONE
     98    };
     99    struct null_display *null = null_display(ndpy);
    100    int i;
    101 
    102    null->configs = CALLOC(Elements(color_formats) - 1, sizeof(*null->configs));
    103    if (!null->configs)
    104       return FALSE;
    105 
    106    /* add configs */
    107    for (i = 0; color_formats[i] != PIPE_FORMAT_NONE; i++) {
    108       if (null->base.screen->is_format_supported(null->base.screen,
    109                color_formats[i], PIPE_TEXTURE_2D, 0,
    110                PIPE_BIND_RENDER_TARGET)) {
    111          struct native_config *nconf = &null->configs[null->num_configs];
    112 
    113          nconf->color_format = color_formats[i];
    114          nconf->buffer_mask = 1 << NATIVE_ATTACHMENT_BACK_LEFT;
    115          null->num_configs++;
    116       }
    117    }
    118 
    119    return TRUE;
    120 }
    121 
    122 static boolean
    123 null_display_init_screen(struct native_display *ndpy)
    124 {
    125    struct null_display *null = null_display(ndpy);
    126    struct sw_winsys *ws;
    127 
    128    ws = null_sw_create();
    129    if (!ws)
    130       return FALSE;
    131 
    132    null->base.screen = null->event_handler->new_sw_screen(&null->base, ws);
    133    if (!null->base.screen) {
    134       if (ws->destroy)
    135          ws->destroy(ws);
    136       return FALSE;
    137    }
    138 
    139    if (!null_display_init_config(&null->base)) {
    140       ndpy_uninit(&null->base);
    141       return FALSE;
    142    }
    143 
    144    return TRUE;
    145 }
    146 
    147 static struct native_display *
    148 null_display_create(const struct native_event_handler *event_handler)
    149 {
    150    struct null_display *null;
    151 
    152    null = CALLOC_STRUCT(null_display);
    153    if (!null)
    154       return NULL;
    155 
    156    null->event_handler = event_handler;
    157 
    158    null->base.init_screen = null_display_init_screen;
    159    null->base.destroy = null_display_destroy;
    160    null->base.get_param = null_display_get_param;
    161    null->base.get_configs = null_display_get_configs;
    162 
    163    return &null->base;
    164 }
    165 
    166 static const struct native_event_handler *null_event_handler;
    167 
    168 static struct native_display *
    169 native_create_display(void *dpy, boolean use_sw)
    170 {
    171    struct native_display *ndpy = NULL;
    172 
    173    /* the only valid display is NULL */
    174    if (!dpy)
    175       ndpy = null_display_create(null_event_handler);
    176 
    177    return ndpy;
    178 }
    179 
    180 static const struct native_platform null_platform = {
    181    "NULL", /* name */
    182    native_create_display
    183 };
    184 
    185 const struct native_platform *
    186 native_get_null_platform(const struct native_event_handler *event_handler)
    187 {
    188    null_event_handler = event_handler;
    189    return &null_platform;
    190 }
    191