/* * Mesa 3-D graphics library * Version: 7.8 * * Copyright (C) 2009-2010 Chia-I Wu <olv@0xlab.org> * * 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" #ifdef __cplusplus extern "C" { #endif #include "native_buffer.h" #include "native_modeset.h" #include "native_wayland_bufmgr.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, /** * Return TRUE if native_surface::present can preserve the buffer. */ NATIVE_PARAM_PRESERVE_BUFFER, /** * Return the maximum supported swap interval. */ NATIVE_PARAM_MAX_SWAP_INTERVAL, /** * Return TRUE if the display supports premultiplied alpha, regardless of * the surface color format. * * Note that returning TRUE for this parameter will make * EGL_VG_ALPHA_FORMAT_PRE_BIT to be set for all EGLConfig's with non-zero * EGL_ALPHA_SIZE. EGL_VG_ALPHA_FORMAT attribute of a surface will affect * how the surface is presented. */ NATIVE_PARAM_PREMULTIPLIED_ALPHA, /** * Return TRUE if native_surface::present supports presenting a partial * surface. */ NATIVE_PARAM_PRESENT_REGION }; /** * Control how a surface presentation should happen. */ struct native_present_control { /**< the attachment to present */ enum native_attachment natt; /**< the contents of the presented attachment should be preserved */ boolean preserve; /**< wait until the given vsyncs has passed since the last presentation */ uint swap_interval; /**< pixels use premultiplied alpha */ boolean premultiplied_alpha; /**< The region to present. y=0=top. If num_rects is 0, the whole surface is to be presented */ int num_rects; const int *rects; /* x, y, width, height */ }; struct native_surface { /** * Available for caller's use. */ void *user_data; void (*destroy)(struct native_surface *nsurf); /** * Present the given buffer to the native engine. */ boolean (*present)(struct native_surface *nsurf, const struct native_present_control *ctrl); /** * 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; 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; /** * Context used for copy operations. */ struct pipe_context *pipe; /** * Available for caller's use. */ void *user_data; /** * Initialize and create the pipe screen. */ boolean (*init_screen)(struct native_display *ndpy); 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); /** * Get the color format of the pixmap. Required unless no config has * pixmap_bit set. */ boolean (*get_pixmap_format)(struct native_display *ndpy, EGLNativePixmapType pix, enum pipe_format *format); /** * Copy the contents of the resource to the pixmap's front-left attachment. * This is used to implement eglCopyBuffers. Required unless no config has * pixmap_bit set. */ boolean (*copy_to_pixmap)(struct native_display *ndpy, EGLNativePixmapType pix, struct pipe_resource *src); /** * 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. The native config may be NULL. In that case, a * "best config" will be picked. 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_buffer *buffer; const struct native_display_modeset *modeset; const struct native_display_wayland_bufmgr *wayland_bufmgr; }; /** * 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); struct pipe_resource *(*lookup_egl_image)(struct native_display *ndpy, void *egl_image); }; /** * 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)); } /** * Get the display copy context */ static INLINE struct pipe_context * ndpy_get_copy_context(struct native_display *ndpy) { if (!ndpy->pipe) ndpy->pipe = ndpy->screen->context_create(ndpy->screen, NULL); return ndpy->pipe; } /** * Free display screen and context resources */ static INLINE void ndpy_uninit(struct native_display *ndpy) { if (ndpy->pipe) ndpy->pipe->destroy(ndpy->pipe); if (ndpy->screen) ndpy->screen->destroy(ndpy->screen); } struct native_platform { const char *name; /** * Create the native display and usually establish a connection to the * display server. * * No event should be generated at this stage. */ struct native_display *(*create_display)(void *dpy, boolean use_sw); }; const struct native_platform * native_get_gdi_platform(const struct native_event_handler *event_handler); const struct native_platform * native_get_x11_platform(const struct native_event_handler *event_handler); const struct native_platform * native_get_wayland_platform(const struct native_event_handler *event_handler); const struct native_platform * native_get_drm_platform(const struct native_event_handler *event_handler); const struct native_platform * native_get_fbdev_platform(const struct native_event_handler *event_handler); const struct native_platform * native_get_null_platform(const struct native_event_handler *event_handler); const struct native_platform * native_get_android_platform(const struct native_event_handler *event_handler); #ifdef __cplusplus } #endif #endif /* _NATIVE_H_ */