native.h revision c67ad0eee8f75e1fd65e8ab2fdd660dc132764ee
149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/* 249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Mesa 3-D graphics library 349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Version: 7.8 449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * 549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Copyright (C) 2009-2010 Chia-I Wu <olv@0xlab.org> 649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * 749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a 849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * copy of this software and associated documentation files (the "Software"), 949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * to deal in the Software without restriction, including without limitation 1049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * and/or sell copies of the Software, and to permit persons to whom the 1249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Software is furnished to do so, subject to the following conditions: 1349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * 1449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * The above copyright notice and this permission notice shall be included 1549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * in all copies or substantial portions of the Software. 1649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * 1749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 2049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 2249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 2449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 2549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#ifndef _NATIVE_H_ 2649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#define _NATIVE_H_ 2749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 2849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "EGL/egl.h" /* for EGL native types */ 2949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "GL/gl.h" /* for GL types needed by __GLcontextModes */ 3049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "GL/internal/glcore.h" /* for __GLcontextModes */ 3149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 3249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_compiler.h" 3349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_screen.h" 3449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_context.h" 3549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_state.h" 3649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 3749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/** 3849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Only color buffers are listed. The others are allocated privately through, 3949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * for example, st_renderbuffer_alloc_storage(). 4049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 4149381d63e61c724b156b76068058df1c01a906c2Chia-I Wuenum native_attachment { 4249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu NATIVE_ATTACHMENT_FRONT_LEFT, 4349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu NATIVE_ATTACHMENT_BACK_LEFT, 4449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu NATIVE_ATTACHMENT_FRONT_RIGHT, 4549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu NATIVE_ATTACHMENT_BACK_RIGHT, 4649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 4749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu NUM_NATIVE_ATTACHMENTS 4849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}; 4949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 5049381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct native_surface { 5149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu void (*destroy)(struct native_surface *nsurf); 5249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 5349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu /** 5449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Swap the front and back buffers so that the back buffer is visible. It 5549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * is no-op if the surface is single-buffered. The contents of the back 5649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * buffer after swapping may or may not be preserved. 5749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 5849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu boolean (*swap_buffers)(struct native_surface *nsurf); 5949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 6049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu /** 6149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Make the front buffer visible. In some native displays, changes to the 6249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * front buffer might not be visible immediately and require manual flush. 6349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 6449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu boolean (*flush_frontbuffer)(struct native_surface *nsurf); 6549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 6649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu /** 6749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Validate the buffers of the surface. Those not listed in the attachments 6849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * will be destroyed. The returned textures are owned by the caller. 6949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 7049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu boolean (*validate)(struct native_surface *nsurf, 7149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu const enum native_attachment *natts, 7249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu unsigned num_natts, 7349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct pipe_texture **textures, 7449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu int *width, int *height); 7549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 7649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu /** 7749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Wait until all native commands affecting the surface has been executed. 7849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 7949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu void (*wait)(struct native_surface *nsurf); 8049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}; 8149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 8249381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct native_config { 8349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu __GLcontextModes mode; 8449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu enum pipe_format color_format; 8549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu enum pipe_format depth_format; 8649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu enum pipe_format stencil_format; 87c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu 88c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu /* treat it as an additional flag to mode.drawableType */ 89c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu boolean scanout_bit; 90c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu}; 91c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu 92c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wustruct native_connector { 93c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu int dummy; 9449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}; 9549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 96c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wustruct native_mode { 97c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu const char *desc; 98c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu int width, height; 99c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu int refresh_rate; 100c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu}; 101c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu 102c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wustruct native_display_modeset; 103c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu 10449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/** 10549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * A pipe winsys abstracts the OS. A pipe screen abstracts the graphcis 10649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * hardware. A native display consists of a pipe winsys, a pipe screen, and 10749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * the native display server. 10849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 10949381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct native_display { 11049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct pipe_screen *screen; 11149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu void (*destroy)(struct native_display *ndpy); 11249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 11349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu /** 11449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Get the supported configs. The configs are owned by the display, but 11549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * the returned array should be free()ed. 11649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * 11749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * The configs will be converted to EGL config by 11849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * _eglConfigFromContextModesRec and validated by _eglValidateConfig. 11949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Those failing to pass the test will be skipped. 12049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 12149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu const struct native_config **(*get_configs)(struct native_display *ndpy, 12249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu int *num_configs); 12349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 12449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu /** 12549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Create a pipe context. 12649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 12749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct pipe_context *(*create_context)(struct native_display *ndpy, 12849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu void *context_private); 12949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 13049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu /** 13149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Create a window surface. Required unless no config has GLX_WINDOW_BIT 13249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * set. 13349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 13449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct native_surface *(*create_window_surface)(struct native_display *ndpy, 13549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu EGLNativeWindowType win, 13649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu const struct native_config *nconf); 13749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 13849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu /** 13949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Create a pixmap surface. Required unless no config has GLX_PIXMAP_BIT 14049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * set. 14149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 14249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct native_surface *(*create_pixmap_surface)(struct native_display *ndpy, 14349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu EGLNativePixmapType pix, 14449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu const struct native_config *nconf); 14549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 14649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu /** 14749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Create a pbuffer surface. Required unless no config has GLX_PBUFFER_BIT 14849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * set. 14949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 15049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct native_surface *(*create_pbuffer_surface)(struct native_display *ndpy, 15149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu const struct native_config *nconf, 15249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu uint width, uint height); 15349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 154c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu const struct native_display_modeset *modeset; 155c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu}; 15649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 157c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu/** 158c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu * Mode setting interface of the native display. It exposes the mode setting 159c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu * capabilities of the underlying graphics hardware. 160c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu */ 161c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wustruct native_display_modeset { 16249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu /** 163c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu * Get the available physical connectors and the number of CRTCs. 16449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 165c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu const struct native_connector **(*get_connectors)(struct native_display *ndpy, 166c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu int *num_connectors, 167c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu int *num_crtcs); 168c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu 169c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu /** 170c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu * Get the current supported modes of a connector. The returned modes may 171c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu * change every time this function is called and those from previous calls 172c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu * might become invalid. 173c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu */ 174c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu const struct native_mode **(*get_modes)(struct native_display *ndpy, 175c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu const struct native_connector *nconn, 176c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu int *num_modes); 17749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 178c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu /** 179c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu * Create a scan-out surface. Required unless no config has 180c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu * GLX_SCREEN_BIT_MESA set. 181c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu */ 182c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu struct native_surface *(*create_scanout_surface)(struct native_display *ndpy, 183c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu const struct native_config *nconf, 184c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu uint width, uint height); 185c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu 186c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu /** 187c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu * Program the CRTC to output the surface to the given connectors with the 188c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu * given mode. When surface is not given, the CRTC is disabled. 189c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu * 190c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu * This interface does not export a way to query capabilities of the CRTCs. 191c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu * The native display usually needs to dynamically map the index to a CRTC 192c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu * that supports the given connectors. 193c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu */ 194c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu boolean (*program)(struct native_display *ndpy, int crtc_idx, 195c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu struct native_surface *nsurf, uint x, uint y, 196c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu const struct native_connector **nconns, int num_nconns, 197c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu const struct native_mode *nmode); 198c67ad0eee8f75e1fd65e8ab2fdd660dc132764eeChia-I Wu}; 19949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 20049381d63e61c724b156b76068058df1c01a906c2Chia-I Wutypedef void (*native_flush_frontbuffer)(void *dummy, 20149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct pipe_surface *surf, 20249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu void *context_private); 20349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 20449381d63e61c724b156b76068058df1c01a906c2Chia-I Wuconst char * 20549381d63e61c724b156b76068058df1c01a906c2Chia-I Wunative_get_name(void); 20649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 20749381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct native_display * 20849381d63e61c724b156b76068058df1c01a906c2Chia-I Wunative_create_display(EGLNativeDisplayType dpy, 20949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu native_flush_frontbuffer flush_frontbuffer); 21049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 21149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#endif /* _NATIVE_H_ */ 212