/* * Mesa 3-D graphics library * Version: 7.8 * * Copyright (C) 2009-2010 Chia-I Wu * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef _NATIVE_H_ #define _NATIVE_H_ #include "EGL/egl.h" /* for EGL native types */ #include "pipe/p_compiler.h" #include "pipe/p_screen.h" #include "pipe/p_context.h" #include "pipe/p_state.h" #include "state_tracker/sw_winsys.h" #include "native_probe.h" #include "native_modeset.h" /** * Only color buffers are listed. The others are allocated privately through, * for example, st_renderbuffer_alloc_storage(). */ enum native_attachment { NATIVE_ATTACHMENT_FRONT_LEFT, NATIVE_ATTACHMENT_BACK_LEFT, NATIVE_ATTACHMENT_FRONT_RIGHT, NATIVE_ATTACHMENT_BACK_RIGHT, NUM_NATIVE_ATTACHMENTS }; enum native_param_type { /* * Return TRUE if window/pixmap surfaces use the buffers of the native * types. */ NATIVE_PARAM_USE_NATIVE_BUFFER }; struct native_surface { /** * Available for caller's use. */ void *user_data; void (*destroy)(struct native_surface *nsurf); /** * Swap the front and back buffers so that the back buffer is visible. It * is no-op if the surface is single-buffered. The contents of the back * buffer after swapping may or may not be preserved. */ boolean (*swap_buffers)(struct native_surface *nsurf); /** * Make the front buffer visible. In some native displays, changes to the * front buffer might not be visible immediately and require manual flush. */ boolean (*flush_frontbuffer)(struct native_surface *nsurf); /** * Validate the buffers of the surface. textures, if not NULL, points to an * array of size NUM_NATIVE_ATTACHMENTS and the returned textures are owned * by the caller. A sequence number is also returned. The caller can use * it to check if anything has changed since the last call. Any of the * pointers may be NULL and it indicates the caller has no interest in those * values. * * If this function is called multiple times with different attachment * masks, those not listed in the latest call might be destroyed. This * behavior might change in the future. */ boolean (*validate)(struct native_surface *nsurf, uint attachment_mask, unsigned int *seq_num, struct pipe_resource **textures, int *width, int *height); /** * Wait until all native commands affecting the surface has been executed. */ void (*wait)(struct native_surface *nsurf); }; /** * Describe a native display config. */ struct native_config { /* available buffers and their format */ uint buffer_mask; enum pipe_format color_format; /* supported surface types */ boolean window_bit; boolean pixmap_bit; boolean scanout_bit; int native_visual_id; int native_visual_type; int level; int samples; boolean slow_config; boolean transparent_rgb; int transparent_rgb_values[3]; }; /** * A pipe winsys abstracts the OS. A pipe screen abstracts the graphcis * hardware. A native display consists of a pipe winsys, a pipe screen, and * the native display server. */ struct native_display { /** * The pipe screen of the native display. */ struct pipe_screen *screen; /** * Available for caller's use. */ void *user_data; void (*destroy)(struct native_display *ndpy); /** * Query the parameters of the native display. * * The return value is defined by the parameter. */ int (*get_param)(struct native_display *ndpy, enum native_param_type param); /** * Get the supported configs. The configs are owned by the display, but * the returned array should be FREE()ed. */ const struct native_config **(*get_configs)(struct native_display *ndpy, int *num_configs); /** * Test if a pixmap is supported by the given config. Required unless no * config has pixmap_bit set. * * This function is usually called to find a config that supports a given * pixmap. Thus, it is usually called with the same pixmap in a row. */ boolean (*is_pixmap_supported)(struct native_display *ndpy, EGLNativePixmapType pix, const struct native_config *nconf); /** * Create a window surface. Required unless no config has window_bit set. */ struct native_surface *(*create_window_surface)(struct native_display *ndpy, EGLNativeWindowType win, const struct native_config *nconf); /** * Create a pixmap surface. Required unless no config has pixmap_bit set. */ struct native_surface *(*create_pixmap_surface)(struct native_display *ndpy, EGLNativePixmapType pix, const struct native_config *nconf); const struct native_display_modeset *modeset; }; /** * The handler for events that a native display may generate. The events are * generated asynchronously and the handler may be called by any thread at any * time. */ struct native_event_handler { /** * This function is called when a surface needs to be validated. */ void (*invalid_surface)(struct native_display *ndpy, struct native_surface *nsurf, unsigned int seq_num); struct pipe_screen *(*new_drm_screen)(struct native_display *ndpy, const char *name, int fd); struct pipe_screen *(*new_sw_screen)(struct native_display *ndpy, struct sw_winsys *ws); }; /** * Test whether an attachment is set in the mask. */ static INLINE boolean native_attachment_mask_test(uint mask, enum native_attachment att) { return !!(mask & (1 << att)); } struct native_platform { const char *name; /** * Return a probe object for the given display. * * Note that the returned object may be cached and used by different native * display modules. It allows fast probing when multiple modules probe the * same display. */ struct native_probe *(*create_probe)(void *dpy); /** * Probe the probe object. */ enum native_probe_result (*get_probe_result)(struct native_probe *nprobe); struct native_display *(*create_display)(void *dpy, struct native_event_handler *handler, void *user_data); }; const struct native_platform * native_get_gdi_platform(void); const struct native_platform * native_get_x11_platform(void); const struct native_platform * native_get_kms_platform(void); const struct native_platform * native_get_fbdev_platform(void); #endif /* _NATIVE_H_ */