blob: 941adfc03ff9ff694b996836432c9e0a3df31e20 [file] [log] [blame]
/*
* 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 "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);
};
/**
* 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);
};
const struct native_platform *
native_get_platform(void);
#endif /* _NATIVE_H_ */