QortalOS Brooklyn for Raspberry Pi 4
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

346 lines
7.4 KiB

/*
Copyright (c) 2012, Broadcom Europe Ltd
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef EGL_CLIENT_SURFACE_H
#define EGL_CLIENT_SURFACE_H
#include "interface/khronos/include/EGL/egl.h"
#include "interface/khronos/include/EGL/eglext.h"
#include "interface/khronos/include/VG/openvg.h"
#include "interface/khronos/egl/egl_int.h"
#include "interface/khronos/common/khrn_client_platform.h"
typedef enum {
WINDOW,
PBUFFER,
PIXMAP
} EGL_SURFACE_TYPE_T;
typedef enum {
SRGB,
LINEAR
} EGL_SURFACE_COLORSPACE_T;
typedef enum {
NONPRE,
PRE
} EGL_SURFACE_ALPHAFORMAT_T;
typedef struct {
EGLSurface name;
/*
type
Invariants:
(EGL_SURFACE_TYPE)
type in {WINDOW, PBUFFER, PIXMAP}
*/
EGL_SURFACE_TYPE_T type;
/*
colorspace
Invariants:
(EGL_SURFACE_COLORSPACE)
colorspace in {SRGB, LINEAR}
*/
EGL_SURFACE_COLORSPACE_T colorspace;
/*
alphaformat
Invariants:
(EGL_SURFACE_ALPHAFORMAT)
alphaformat in {NONPRE, PRE}
*/
EGL_SURFACE_ALPHAFORMAT_T alphaformat;
/*
config
Invariants:
(EGL_SURFACE_CONFIG)
config is a valid EGLConfig
*/
EGLConfig config;
uint32_t base_width;
uint32_t base_height;
/*
buffers
Usually 1 or 3.
Invariants:
(EGL_SURFACE_BUFFERS)
1 <= buffers <= EGL_MAX_BUFFERS
*/
uint32_t buffers;
/*
width
Invariants:
(EGL_SURFACE_WIDTH)
1 <= width <= EGL_CONFIG_MAX_WIDTH
*/
uint32_t width;
/*
height
Invariants:
(EGL_SURFACE_HEIGHT)
1 <= height <= EGL_CONFIG_MAX_HEIGHT
*/
uint32_t height;
EGL_SURFACE_ID_T serverbuffer;
/*
context_binding_count
Invariant:
(EGL_SURFACE_BINDING_COUNT)
If we are current, how many times we are bound to the current context. Otherwise 0.
*/
uint32_t context_binding_count;
struct CLIENT_THREAD_STATE *thread; // If we are current, which the EGL client state for the thread are we associated with.
#if EGL_KHR_lock_surface
EGLBoolean is_locked;
void *mapped_buffer;
#endif
/*
is_destroyed
Invariant:
(EGL_SURFACE_IS_DESTROYED)
Iff true, is not a member of the CLIENT_PROCESS_STATE_T.surfaces
*/
bool is_destroyed;
/*
swap_behavior
Invariant:
(EGL_SURFACE_SWAP_BEHAVIOUR)
swap_behavior in {EGL_BUFFER_DESTROYED, EGL_BUFFER_PRESERVED}
*/
EGLint swap_behavior;
/*
multisample_resolve
Invariant:
(EGL_SURFACE_MULTISAMPLE_RESOLVE)
multisample_resolve == EGL_MULTISAMPLE_RESOLVE_DEFAULT
*/
EGLint multisample_resolve;
/* For WINDOW types only */
/*
win
Validity:
type == WINDOW
*/
EGLNativeWindowType win;
/*
win
Validity:
type == WINDOW
*/
uint32_t swap_interval;
uint32_t internal_handle; // stores "serverwin"
/*
avail_buffers
named counting semaphore, only used for triple-buffered window surfaces
Validity:
avail_buffers_valid
*/
PLATFORM_SEMAPHORE_T avail_buffers;
bool avail_buffers_valid;
/* For PBUFFER types only */
/*
largest_pbuffer
Validity:
type == PBUFFER
*/
bool largest_pbuffer;
/*
mipmap_texture
Validity:
type == PBUFFER
*/
bool mipmap_texture;
/*
mipmap_level
Validity:
type == PBUFFER
*/
uint32_t mipmap_level;
/*
texture_format
Validity:
type == PBUFFER
Invariant:
texture_format in {EGL_NO_TEXTURE, EGL_TEXTURE_RGB, EGL_TEXTURE_RGBA}
*/
EGLenum texture_format;
/*
texture_target
Validity:
type == PBUFFER
Invariant:
texture_target in {EGL_NO_TEXTURE, EGL_TEXTURE_2D}
*/
EGLenum texture_target;
/* For PIXMAP types only */
/*
pixmap
Validity:
type == PIXMAP
Invariant:
pixmap is a valid client-side pixmap handle for pixmap P
*/
EGLNativePixmapType pixmap;
/*
pixmap_server_handle
Validity:
type == PIXMAP
Invariant:
If P is a server-side pixmap then
pixmap_server_handle is a valid server-side handle for pixmap P
else
pixmap_server_handle = [0, -1]
*/
uint32_t pixmap_server_handle[2];
/*
pixmap_server_handle
Validity:
type == PIXMAP
*/
bool server_owned;
} EGL_SURFACE_T;
extern bool egl_surface_check_attribs(
EGL_SURFACE_TYPE_T type,
const EGLint *attrib_list,
bool *linear,
bool *premult,
bool *single,
int *width,
int *height,
bool *largest_pbuffer,
EGLenum *texture_format,
EGLenum *texture_target,
bool *mipmap_texture
);
struct CLIENT_PROCESS_STATE;
extern EGL_SURFACE_T *egl_surface_create(
EGLSurface name,
EGL_SURFACE_TYPE_T type,
EGL_SURFACE_COLORSPACE_T colorspace,
EGL_SURFACE_ALPHAFORMAT_T alphaformat,
uint32_t buffers,
uint32_t width,
uint32_t height,
EGLConfig config,
EGLNativeWindowType win,
uint32_t serverwin,
bool largest_pbuffer,
bool texture_compatibility,
bool mipmap_texture,
EGLenum texture_format,
EGLenum texture_target,
EGLNativePixmapType pixmap,
const uint32_t *pixmap_server_handle);
extern EGL_SURFACE_T *egl_surface_from_vg_image(
VGImage vg_handle,
EGLSurface name,
EGLConfig config,
EGLBoolean largest_pbuffer,
EGLBoolean mipmap_texture,
EGLenum texture_format,
EGLenum texture_target,
EGLint *error);
extern void egl_surface_free(EGL_SURFACE_T *surface);
extern EGLBoolean egl_surface_get_attrib(EGL_SURFACE_T *surface, EGLint attrib, EGLint *value);
extern EGLint egl_surface_set_attrib(EGL_SURFACE_T *surface, EGLint attrib, EGLint value);
extern EGLint egl_surface_get_render_buffer(EGL_SURFACE_T *surface);
#if EGL_KHR_lock_surface
extern EGLint egl_surface_get_mapped_buffer_attrib(EGL_SURFACE_T *surface, EGLint attrib, EGLint *value);
#endif
extern void egl_surface_maybe_free(EGL_SURFACE_T *surface);
#endif