mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-15 00:24:40 +00:00
sdl 2.0.8 update
This commit is contained in:
parent
d6f6bc65a5
commit
ec8f56b3b0
894 changed files with 66879 additions and 43299 deletions
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -90,9 +90,6 @@
|
|||
#include "SDL_blit.h"
|
||||
#include "SDL_RLEaccel_c.h"
|
||||
|
||||
#ifndef MAX
|
||||
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||
#endif
|
||||
#ifndef MIN
|
||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
#endif
|
||||
|
|
@ -448,7 +445,7 @@ RLEClipBlit(int w, Uint8 * srcbuf, SDL_Surface * surf_dst,
|
|||
|
||||
|
||||
/* blit a colorkeyed RLE surface */
|
||||
int
|
||||
int SDLCALL
|
||||
SDL_RLEBlit(SDL_Surface * surf_src, SDL_Rect * srcrect,
|
||||
SDL_Surface * surf_dst, SDL_Rect * dstrect)
|
||||
{
|
||||
|
|
@ -726,7 +723,7 @@ RLEAlphaClipBlit(int w, Uint8 * srcbuf, SDL_Surface * surf_dst,
|
|||
}
|
||||
|
||||
/* blit a pixel-alpha RLE surface */
|
||||
int
|
||||
int SDLCALL
|
||||
SDL_RLEAlphaBlit(SDL_Surface * surf_src, SDL_Rect * srcrect,
|
||||
SDL_Surface * surf_dst, SDL_Rect * dstrect)
|
||||
{
|
||||
|
|
@ -1280,7 +1277,7 @@ RLEColorkeySurface(SDL_Surface * surface)
|
|||
int y;
|
||||
Uint8 *srcbuf, *lastline;
|
||||
int maxsize = 0;
|
||||
int bpp = surface->format->BytesPerPixel;
|
||||
const int bpp = surface->format->BytesPerPixel;
|
||||
getpix_func getpix;
|
||||
Uint32 ckey, rgbmask;
|
||||
int w, h;
|
||||
|
|
@ -1303,6 +1300,9 @@ RLEColorkeySurface(SDL_Surface * surface)
|
|||
maxsize = surface->h * (4 * (surface->w / 65535 + 1)
|
||||
+ surface->w * 4) + 4;
|
||||
break;
|
||||
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
rlebuf = (Uint8 *) SDL_malloc(maxsize);
|
||||
|
|
@ -1396,7 +1396,7 @@ RLEColorkeySurface(SDL_Surface * surface)
|
|||
surface->map->data = p;
|
||||
}
|
||||
|
||||
return (0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -23,9 +23,9 @@
|
|||
/* Useful functions and variables from SDL_RLEaccel.c */
|
||||
|
||||
extern int SDL_RLESurface(SDL_Surface * surface);
|
||||
extern int SDL_RLEBlit(SDL_Surface * src, SDL_Rect * srcrect,
|
||||
SDL_Surface * dst, SDL_Rect * dstrect);
|
||||
extern int SDL_RLEAlphaBlit(SDL_Surface * src, SDL_Rect * srcrect,
|
||||
SDL_Surface * dst, SDL_Rect * dstrect);
|
||||
extern int SDLCALL SDL_RLEBlit (SDL_Surface * src, SDL_Rect * srcrect,
|
||||
SDL_Surface * dst, SDL_Rect * dstrect);
|
||||
extern int SDLCALL SDL_RLEAlphaBlit(SDL_Surface * src, SDL_Rect * srcrect,
|
||||
SDL_Surface * dst, SDL_Rect * dstrect);
|
||||
extern void SDL_UnRLESurface(SDL_Surface * surface, int recode);
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -30,7 +30,7 @@
|
|||
#include "SDL_pixels_c.h"
|
||||
|
||||
/* The general purpose software blit routine */
|
||||
static int
|
||||
static int SDLCALL
|
||||
SDL_SoftBlit(SDL_Surface * src, SDL_Rect * srcrect,
|
||||
SDL_Surface * dst, SDL_Rect * dstrect)
|
||||
{
|
||||
|
|
@ -219,6 +219,12 @@ SDL_CalculateBlit(SDL_Surface * surface)
|
|||
SDL_BlitMap *map = surface->map;
|
||||
SDL_Surface *dst = map->dst;
|
||||
|
||||
/* We don't currently support blitting to < 8 bpp surfaces */
|
||||
if (dst->format->BitsPerPixel < 8) {
|
||||
SDL_InvalidateMap(map);
|
||||
return SDL_SetError("Blit combination not supported");
|
||||
}
|
||||
|
||||
/* Clean everything out to start */
|
||||
if ((surface->flags & SDL_RLEACCEL) == SDL_RLEACCEL) {
|
||||
SDL_UnRLESurface(surface, 1);
|
||||
|
|
@ -239,6 +245,10 @@ SDL_CalculateBlit(SDL_Surface * surface)
|
|||
/* Choose a standard blit function */
|
||||
if (map->identity && !(map->info.flags & ~SDL_COPY_RLE_DESIRED)) {
|
||||
blit = SDL_BlitCopy;
|
||||
} else if (surface->format->Rloss > 8 || dst->format->Rloss > 8) {
|
||||
/* Greater than 8 bits per channel not supported yet */
|
||||
SDL_InvalidateMap(map);
|
||||
return SDL_SetError("Blit combination not supported");
|
||||
} else if (surface->format->BitsPerPixel < 8 &&
|
||||
SDL_ISPIXELFORMAT_INDEXED(surface->format->format)) {
|
||||
blit = SDL_CalculateBlit0(surface);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -20,8 +20,8 @@
|
|||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_blit_h
|
||||
#define _SDL_blit_h
|
||||
#ifndef SDL_blit_h_
|
||||
#define SDL_blit_h_
|
||||
|
||||
#include "SDL_cpuinfo.h"
|
||||
#include "SDL_endian.h"
|
||||
|
|
@ -70,7 +70,8 @@ typedef struct
|
|||
Uint8 r, g, b, a;
|
||||
} SDL_BlitInfo;
|
||||
|
||||
typedef void (SDLCALL * SDL_BlitFunc) (SDL_BlitInfo * info);
|
||||
typedef void (*SDL_BlitFunc) (SDL_BlitInfo *info);
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
|
@ -443,19 +444,19 @@ do { \
|
|||
/* Blend the RGB values of two pixels with an alpha value */
|
||||
#define ALPHA_BLEND_RGB(sR, sG, sB, A, dR, dG, dB) \
|
||||
do { \
|
||||
dR = ((((unsigned)(sR-dR)*(unsigned)A)/255)+dR); \
|
||||
dG = ((((unsigned)(sG-dG)*(unsigned)A)/255)+dG); \
|
||||
dB = ((((unsigned)(sB-dB)*(unsigned)A)/255)+dB); \
|
||||
dR = (Uint8)((((int)(sR-dR)*(int)A)/255)+dR); \
|
||||
dG = (Uint8)((((int)(sG-dG)*(int)A)/255)+dG); \
|
||||
dB = (Uint8)((((int)(sB-dB)*(int)A)/255)+dB); \
|
||||
} while(0)
|
||||
|
||||
|
||||
/* Blend the RGBA values of two pixels */
|
||||
#define ALPHA_BLEND_RGBA(sR, sG, sB, sA, dR, dG, dB, dA) \
|
||||
do { \
|
||||
dR = ((((unsigned)(sR-dR)*(unsigned)sA)/255)+dR); \
|
||||
dG = ((((unsigned)(sG-dG)*(unsigned)sA)/255)+dG); \
|
||||
dB = ((((unsigned)(sB-dB)*(unsigned)sA)/255)+dB); \
|
||||
dA = ((unsigned)sA+(unsigned)dA-((unsigned)sA*dA)/255); \
|
||||
dR = (Uint8)((((int)(sR-dR)*(int)sA)/255)+dR); \
|
||||
dG = (Uint8)((((int)(sG-dG)*(int)sA)/255)+dG); \
|
||||
dB = (Uint8)((((int)(sB-dB)*(int)sA)/255)+dB); \
|
||||
dA = (Uint8)((int)sA+dA-((int)sA*dA)/255); \
|
||||
} while(0)
|
||||
|
||||
|
||||
|
|
@ -471,14 +472,14 @@ do { \
|
|||
#define DUFFS_LOOP8(pixel_copy_increment, width) \
|
||||
{ int n = (width+7)/8; \
|
||||
switch (width & 7) { \
|
||||
case 0: do { pixel_copy_increment; \
|
||||
case 7: pixel_copy_increment; \
|
||||
case 6: pixel_copy_increment; \
|
||||
case 5: pixel_copy_increment; \
|
||||
case 4: pixel_copy_increment; \
|
||||
case 3: pixel_copy_increment; \
|
||||
case 2: pixel_copy_increment; \
|
||||
case 1: pixel_copy_increment; \
|
||||
case 0: do { pixel_copy_increment; /* fallthrough */ \
|
||||
case 7: pixel_copy_increment; /* fallthrough */ \
|
||||
case 6: pixel_copy_increment; /* fallthrough */ \
|
||||
case 5: pixel_copy_increment; /* fallthrough */ \
|
||||
case 4: pixel_copy_increment; /* fallthrough */ \
|
||||
case 3: pixel_copy_increment; /* fallthrough */ \
|
||||
case 2: pixel_copy_increment; /* fallthrough */ \
|
||||
case 1: pixel_copy_increment; /* fallthrough */ \
|
||||
} while ( --n > 0 ); \
|
||||
} \
|
||||
}
|
||||
|
|
@ -487,10 +488,10 @@ do { \
|
|||
#define DUFFS_LOOP4(pixel_copy_increment, width) \
|
||||
{ int n = (width+3)/4; \
|
||||
switch (width & 3) { \
|
||||
case 0: do { pixel_copy_increment; \
|
||||
case 3: pixel_copy_increment; \
|
||||
case 2: pixel_copy_increment; \
|
||||
case 1: pixel_copy_increment; \
|
||||
case 0: do { pixel_copy_increment; /* fallthrough */ \
|
||||
case 3: pixel_copy_increment; /* fallthrough */ \
|
||||
case 2: pixel_copy_increment; /* fallthrough */ \
|
||||
case 1: pixel_copy_increment; /* fallthrough */ \
|
||||
} while (--n > 0); \
|
||||
} \
|
||||
}
|
||||
|
|
@ -547,6 +548,6 @@ do { \
|
|||
#pragma warning(disable: 4550)
|
||||
#endif
|
||||
|
||||
#endif /* _SDL_blit_h */
|
||||
#endif /* SDL_blit_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -70,12 +70,14 @@ Blit1to1(SDL_BlitInfo * info)
|
|||
}
|
||||
|
||||
/* This is now endian dependent */
|
||||
#if ( SDL_BYTEORDER == SDL_LIL_ENDIAN )
|
||||
#define HI 1
|
||||
#define LO 0
|
||||
#else /* ( SDL_BYTEORDER == SDL_BIG_ENDIAN ) */
|
||||
#define HI 0
|
||||
#define LO 1
|
||||
#ifndef USE_DUFFS_LOOP
|
||||
# if ( SDL_BYTEORDER == SDL_LIL_ENDIAN )
|
||||
# define HI 1
|
||||
# define LO 0
|
||||
# else /* ( SDL_BYTEORDER == SDL_BIG_ENDIAN ) */
|
||||
# define HI 0
|
||||
# define LO 1
|
||||
# endif
|
||||
#endif
|
||||
static void
|
||||
Blit1to2(SDL_BlitInfo * info)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -1317,9 +1317,9 @@ SDL_CalculateBlitA(SDL_Surface * surface)
|
|||
|
||||
case 3:
|
||||
default:
|
||||
return BlitNtoNPixelAlpha;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
return BlitNtoNPixelAlpha;
|
||||
|
||||
case SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND:
|
||||
if (sf->Amask == 0) {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -118,12 +118,6 @@ calc_swizzle32(const SDL_PixelFormat * srcfmt, const SDL_PixelFormat * dstfmt)
|
|||
16, 8, 0, 24,
|
||||
0, NULL
|
||||
};
|
||||
if (!srcfmt) {
|
||||
srcfmt = &default_pixel_format;
|
||||
}
|
||||
if (!dstfmt) {
|
||||
dstfmt = &default_pixel_format;
|
||||
}
|
||||
const vector unsigned char plus = VECUINT8_LITERAL(0x00, 0x00, 0x00, 0x00,
|
||||
0x04, 0x04, 0x04, 0x04,
|
||||
0x08, 0x08, 0x08, 0x08,
|
||||
|
|
@ -131,11 +125,20 @@ calc_swizzle32(const SDL_PixelFormat * srcfmt, const SDL_PixelFormat * dstfmt)
|
|||
0x0C);
|
||||
vector unsigned char vswiz;
|
||||
vector unsigned int srcvec;
|
||||
Uint32 rmask, gmask, bmask, amask;
|
||||
|
||||
if (!srcfmt) {
|
||||
srcfmt = &default_pixel_format;
|
||||
}
|
||||
if (!dstfmt) {
|
||||
dstfmt = &default_pixel_format;
|
||||
}
|
||||
|
||||
#define RESHIFT(X) (3 - ((X) >> 3))
|
||||
Uint32 rmask = RESHIFT(srcfmt->Rshift) << (dstfmt->Rshift);
|
||||
Uint32 gmask = RESHIFT(srcfmt->Gshift) << (dstfmt->Gshift);
|
||||
Uint32 bmask = RESHIFT(srcfmt->Bshift) << (dstfmt->Bshift);
|
||||
Uint32 amask;
|
||||
rmask = RESHIFT(srcfmt->Rshift) << (dstfmt->Rshift);
|
||||
gmask = RESHIFT(srcfmt->Gshift) << (dstfmt->Gshift);
|
||||
bmask = RESHIFT(srcfmt->Bshift) << (dstfmt->Bshift);
|
||||
|
||||
/* Use zero for alpha if either surface doesn't have alpha */
|
||||
if (dstfmt->Amask) {
|
||||
amask =
|
||||
|
|
@ -147,6 +150,7 @@ calc_swizzle32(const SDL_PixelFormat * srcfmt, const SDL_PixelFormat * dstfmt)
|
|||
0xFFFFFFFF);
|
||||
}
|
||||
#undef RESHIFT
|
||||
|
||||
((unsigned int *) (char *) &srcvec)[0] = (rmask | gmask | bmask | amask);
|
||||
vswiz = vec_add(plus, (vector unsigned char) vec_splat(srcvec, 0));
|
||||
return (vswiz);
|
||||
|
|
@ -1109,6 +1113,7 @@ Blit_RGB101010_index8(SDL_BlitInfo * info)
|
|||
(((*src)&0x0000F800)>>6)| \
|
||||
(((*src)&0x000000F8)>>3)); \
|
||||
}
|
||||
#ifndef USE_DUFFS_LOOP
|
||||
#define RGB888_RGB555_TWO(dst, src) { \
|
||||
*(Uint32 *)(dst) = (((((src[HI])&0x00F80000)>>9)| \
|
||||
(((src[HI])&0x0000F800)>>6)| \
|
||||
|
|
@ -1117,6 +1122,7 @@ Blit_RGB101010_index8(SDL_BlitInfo * info)
|
|||
(((src[LO])&0x0000F800)>>6)| \
|
||||
(((src[LO])&0x000000F8)>>3); \
|
||||
}
|
||||
#endif
|
||||
static void
|
||||
Blit_RGB888_RGB555(SDL_BlitInfo * info)
|
||||
{
|
||||
|
|
@ -1233,6 +1239,7 @@ Blit_RGB888_RGB555(SDL_BlitInfo * info)
|
|||
(((*src)&0x0000FC00)>>5)| \
|
||||
(((*src)&0x000000F8)>>3)); \
|
||||
}
|
||||
#ifndef USE_DUFFS_LOOP
|
||||
#define RGB888_RGB565_TWO(dst, src) { \
|
||||
*(Uint32 *)(dst) = (((((src[HI])&0x00F80000)>>8)| \
|
||||
(((src[HI])&0x0000FC00)>>5)| \
|
||||
|
|
@ -1241,6 +1248,7 @@ Blit_RGB888_RGB555(SDL_BlitInfo * info)
|
|||
(((src[LO])&0x0000FC00)>>5)| \
|
||||
(((src[LO])&0x000000F8)>>3); \
|
||||
}
|
||||
#endif
|
||||
static void
|
||||
Blit_RGB888_RGB565(SDL_BlitInfo * info)
|
||||
{
|
||||
|
|
@ -2455,6 +2463,9 @@ BlitNto2101010(SDL_BlitInfo * info)
|
|||
}
|
||||
|
||||
/* Normal N to N optimized blitters */
|
||||
#define NO_ALPHA 1
|
||||
#define SET_ALPHA 2
|
||||
#define COPY_ALPHA 4
|
||||
struct blit_table
|
||||
{
|
||||
Uint32 srcR, srcG, srcB;
|
||||
|
|
@ -2462,8 +2473,7 @@ struct blit_table
|
|||
Uint32 dstR, dstG, dstB;
|
||||
Uint32 blit_features;
|
||||
SDL_BlitFunc blitfunc;
|
||||
enum
|
||||
{ NO_ALPHA = 1, SET_ALPHA = 2, COPY_ALPHA = 4 } alpha;
|
||||
Uint32 alpha; /* bitwise NO_ALPHA, SET_ALPHA, COPY_ALPHA */
|
||||
};
|
||||
static const struct blit_table normal_blit_1[] = {
|
||||
/* Default for 8-bit RGB source, never optimized */
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/* DO NOT EDIT! This file is generated by sdlgenblit.pl */
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/* DO NOT EDIT! This file is generated by sdlgenblit.pl */
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -124,6 +124,9 @@ SDL_LoadBMP_RW(SDL_RWops * src, int freesrc)
|
|||
Uint32 biClrUsed = 0;
|
||||
/* Uint32 biClrImportant = 0; */
|
||||
|
||||
(void) haveRGBMasks;
|
||||
(void) haveAlphaMask;
|
||||
|
||||
/* Make sure we are passed a valid data source */
|
||||
surface = NULL;
|
||||
was_error = SDL_FALSE;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Simple DirectMedia Layer
|
||||
* Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
* Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -25,8 +25,12 @@
|
|||
#if SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_WINRT
|
||||
#include "../core/windows/SDL_windows.h"
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_ANDROID
|
||||
#include <android/native_window.h>
|
||||
#endif
|
||||
|
||||
#include "SDL_sysvideo.h"
|
||||
#include "SDL_log.h"
|
||||
#include "SDL_egl_c.h"
|
||||
#include "SDL_loadso.h"
|
||||
#include "SDL_hints.h"
|
||||
|
|
@ -40,10 +44,12 @@
|
|||
|
||||
#if SDL_VIDEO_DRIVER_RPI
|
||||
/* Raspbian places the OpenGL ES/EGL binaries in a non standard path */
|
||||
#define DEFAULT_EGL "/opt/vc/lib/libEGL.so"
|
||||
#define DEFAULT_OGL_ES2 "/opt/vc/lib/libGLESv2.so"
|
||||
#define DEFAULT_OGL_ES_PVR "/opt/vc/lib/libGLES_CM.so"
|
||||
#define DEFAULT_OGL_ES "/opt/vc/lib/libGLESv1_CM.so"
|
||||
#define DEFAULT_EGL ( vc4 ? "libEGL.so.1" : "libbrcmEGL.so" )
|
||||
#define DEFAULT_OGL_ES2 ( vc4 ? "libGLESv2.so.2" : "libbrcmGLESv2.so" )
|
||||
#define ALT_EGL "libEGL.so"
|
||||
#define ALT_OGL_ES2 "libGLESv2.so"
|
||||
#define DEFAULT_OGL_ES_PVR ( vc4 ? "libGLES_CM.so.1" : "libbrcmGLESv2.so" )
|
||||
#define DEFAULT_OGL_ES ( vc4 ? "libGLESv1_CM.so.1" : "libbrcmGLESv2.so" )
|
||||
|
||||
#elif SDL_VIDEO_DRIVER_ANDROID || SDL_VIDEO_DRIVER_VIVANTE
|
||||
/* Android */
|
||||
|
|
@ -59,6 +65,13 @@
|
|||
#define DEFAULT_OGL_ES_PVR "libGLES_CM.dll"
|
||||
#define DEFAULT_OGL_ES "libGLESv1_CM.dll"
|
||||
|
||||
#elif SDL_VIDEO_DRIVER_COCOA
|
||||
/* EGL AND OpenGL ES support via ANGLE */
|
||||
#define DEFAULT_EGL "libEGL.dylib"
|
||||
#define DEFAULT_OGL_ES2 "libGLESv2.dylib"
|
||||
#define DEFAULT_OGL_ES_PVR "libGLES_CM.dylib" //???
|
||||
#define DEFAULT_OGL_ES "libGLESv1_CM.dylib" //???
|
||||
|
||||
#else
|
||||
/* Desktop Linux */
|
||||
#define DEFAULT_OGL "libGL.so.1"
|
||||
|
|
@ -68,46 +81,130 @@
|
|||
#define DEFAULT_OGL_ES "libGLESv1_CM.so.1"
|
||||
#endif /* SDL_VIDEO_DRIVER_RPI */
|
||||
|
||||
#ifdef SDL_VIDEO_STATIC_ANGLE
|
||||
#define LOAD_FUNC(NAME) \
|
||||
_this->egl_data->NAME = (void *)NAME;
|
||||
#else
|
||||
#define LOAD_FUNC(NAME) \
|
||||
_this->egl_data->NAME = SDL_LoadFunction(_this->egl_data->dll_handle, #NAME); \
|
||||
if (!_this->egl_data->NAME) \
|
||||
{ \
|
||||
return SDL_SetError("Could not retrieve EGL function " #NAME); \
|
||||
}
|
||||
|
||||
/* EGL implementation of SDL OpenGL ES support */
|
||||
#ifdef EGL_KHR_create_context
|
||||
static int SDL_EGL_HasExtension(_THIS, const char *ext)
|
||||
#endif
|
||||
|
||||
static const char * SDL_EGL_GetErrorName(EGLint eglErrorCode)
|
||||
{
|
||||
#define SDL_EGL_ERROR_TRANSLATE(e) case e: return #e;
|
||||
switch (eglErrorCode) {
|
||||
SDL_EGL_ERROR_TRANSLATE(EGL_SUCCESS);
|
||||
SDL_EGL_ERROR_TRANSLATE(EGL_NOT_INITIALIZED);
|
||||
SDL_EGL_ERROR_TRANSLATE(EGL_BAD_ACCESS);
|
||||
SDL_EGL_ERROR_TRANSLATE(EGL_BAD_ALLOC);
|
||||
SDL_EGL_ERROR_TRANSLATE(EGL_BAD_ATTRIBUTE);
|
||||
SDL_EGL_ERROR_TRANSLATE(EGL_BAD_CONTEXT);
|
||||
SDL_EGL_ERROR_TRANSLATE(EGL_BAD_CONFIG);
|
||||
SDL_EGL_ERROR_TRANSLATE(EGL_BAD_CURRENT_SURFACE);
|
||||
SDL_EGL_ERROR_TRANSLATE(EGL_BAD_DISPLAY);
|
||||
SDL_EGL_ERROR_TRANSLATE(EGL_BAD_SURFACE);
|
||||
SDL_EGL_ERROR_TRANSLATE(EGL_BAD_MATCH);
|
||||
SDL_EGL_ERROR_TRANSLATE(EGL_BAD_PARAMETER);
|
||||
SDL_EGL_ERROR_TRANSLATE(EGL_BAD_NATIVE_PIXMAP);
|
||||
SDL_EGL_ERROR_TRANSLATE(EGL_BAD_NATIVE_WINDOW);
|
||||
SDL_EGL_ERROR_TRANSLATE(EGL_CONTEXT_LOST);
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
int SDL_EGL_SetErrorEx(const char * message, const char * eglFunctionName, EGLint eglErrorCode)
|
||||
{
|
||||
const char * errorText = SDL_EGL_GetErrorName(eglErrorCode);
|
||||
char altErrorText[32];
|
||||
if (errorText[0] == '\0') {
|
||||
/* An unknown-to-SDL error code was reported. Report its hexadecimal value, instead of its name. */
|
||||
SDL_snprintf(altErrorText, SDL_arraysize(altErrorText), "0x%x", (unsigned int)eglErrorCode);
|
||||
errorText = altErrorText;
|
||||
}
|
||||
return SDL_SetError("%s (call to %s failed, reporting an error of %s)", message, eglFunctionName, errorText);
|
||||
}
|
||||
|
||||
/* EGL implementation of SDL OpenGL ES support */
|
||||
typedef enum {
|
||||
SDL_EGL_DISPLAY_EXTENSION,
|
||||
SDL_EGL_CLIENT_EXTENSION
|
||||
} SDL_EGL_ExtensionType;
|
||||
|
||||
static SDL_bool SDL_EGL_HasExtension(_THIS, SDL_EGL_ExtensionType type, const char *ext)
|
||||
{
|
||||
int i;
|
||||
int len = 0;
|
||||
size_t ext_len;
|
||||
const char *exts;
|
||||
const char *ext_word;
|
||||
const char *ext_override;
|
||||
const char *egl_extstr;
|
||||
const char *ext_start;
|
||||
|
||||
/* Invalid extensions can be rejected early */
|
||||
if (ext == NULL || *ext == 0 || SDL_strchr(ext, ' ') != NULL) {
|
||||
/* SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "SDL_EGL_HasExtension: Invalid EGL extension"); */
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
/* Extensions can be masked with an environment variable.
|
||||
* Unlike the OpenGL override, this will use the set bits of an integer
|
||||
* to disable the extension.
|
||||
* Bit Action
|
||||
* 0 If set, the display extension is masked and not present to SDL.
|
||||
* 1 If set, the client extension is masked and not present to SDL.
|
||||
*/
|
||||
ext_override = SDL_getenv(ext);
|
||||
if (ext_override != NULL) {
|
||||
int disable_ext = SDL_atoi(ext_override);
|
||||
if (disable_ext & 0x01 && type == SDL_EGL_DISPLAY_EXTENSION) {
|
||||
return SDL_FALSE;
|
||||
} else if (disable_ext & 0x02 && type == SDL_EGL_CLIENT_EXTENSION) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
ext_len = SDL_strlen(ext);
|
||||
exts = _this->egl_data->eglQueryString(_this->egl_data->egl_display, EGL_EXTENSIONS);
|
||||
switch (type) {
|
||||
case SDL_EGL_DISPLAY_EXTENSION:
|
||||
egl_extstr = _this->egl_data->eglQueryString(_this->egl_data->egl_display, EGL_EXTENSIONS);
|
||||
break;
|
||||
case SDL_EGL_CLIENT_EXTENSION:
|
||||
/* EGL_EXT_client_extensions modifies eglQueryString to return client extensions
|
||||
* if EGL_NO_DISPLAY is passed. Implementations without it are required to return NULL.
|
||||
* This behavior is included in EGL 1.5.
|
||||
*/
|
||||
egl_extstr = _this->egl_data->eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
|
||||
break;
|
||||
default:
|
||||
/* SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "SDL_EGL_HasExtension: Invalid extension type"); */
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (exts) {
|
||||
ext_word = exts;
|
||||
if (egl_extstr != NULL) {
|
||||
ext_start = egl_extstr;
|
||||
|
||||
for (i = 0; exts[i] != 0; i++) {
|
||||
if (exts[i] == ' ') {
|
||||
if (ext_len == len && !SDL_strncmp(ext_word, ext, len)) {
|
||||
return 1;
|
||||
while (*ext_start) {
|
||||
ext_start = SDL_strstr(ext_start, ext);
|
||||
if (ext_start == NULL) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
/* Check if the match is not just a substring of one of the extensions */
|
||||
if (ext_start == egl_extstr || *(ext_start - 1) == ' ') {
|
||||
if (ext_start[ext_len] == ' ' || ext_start[ext_len] == 0) {
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
len = 0;
|
||||
ext_word = &exts[i + 1];
|
||||
} else {
|
||||
len++;
|
||||
}
|
||||
/* If the search stopped in the middle of an extension, skip to the end of it */
|
||||
ext_start += ext_len;
|
||||
while (*ext_start != ' ' && *ext_start != 0) {
|
||||
ext_start++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
return SDL_FALSE;
|
||||
}
|
||||
#endif /* EGL_KHR_create_context */
|
||||
|
||||
void *
|
||||
SDL_EGL_GetProcAddress(_THIS, const char *proc)
|
||||
|
|
@ -116,7 +213,7 @@ SDL_EGL_GetProcAddress(_THIS, const char *proc)
|
|||
void *retval;
|
||||
|
||||
/* eglGetProcAddress is busted on Android http://code.google.com/p/android/issues/detail?id=7681 */
|
||||
#if !defined(SDL_VIDEO_DRIVER_ANDROID) && !defined(SDL_VIDEO_DRIVER_MIR)
|
||||
#if !defined(SDL_VIDEO_DRIVER_ANDROID)
|
||||
if (_this->egl_data->eglGetProcAddress) {
|
||||
retval = _this->egl_data->eglGetProcAddress(proc);
|
||||
if (retval) {
|
||||
|
|
@ -158,16 +255,20 @@ SDL_EGL_UnloadLibrary(_THIS)
|
|||
}
|
||||
|
||||
int
|
||||
SDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_display)
|
||||
SDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_display, EGLenum platform)
|
||||
{
|
||||
void *dll_handle = NULL, *egl_dll_handle = NULL; /* The naming is counter intuitive, but hey, I just work here -- Gabriel */
|
||||
const char *path = NULL;
|
||||
int egl_version_major = 0, egl_version_minor = 0;
|
||||
#if SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_WINRT
|
||||
const char *d3dcompiler;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_RPI
|
||||
SDL_bool vc4 = (0 == access("/sys/module/vc4/", F_OK));
|
||||
#endif
|
||||
|
||||
if (_this->egl_data) {
|
||||
return SDL_SetError("OpenGL ES context already created");
|
||||
return SDL_SetError("EGL context already created");
|
||||
}
|
||||
|
||||
_this->egl_data = (struct SDL_EGL_VideoData *) SDL_calloc(1, sizeof(SDL_EGL_VideoData));
|
||||
|
|
@ -185,10 +286,13 @@ SDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_displa
|
|||
}
|
||||
}
|
||||
if (SDL_strcasecmp(d3dcompiler, "none") != 0) {
|
||||
SDL_LoadObject(d3dcompiler);
|
||||
if (SDL_LoadObject(d3dcompiler) == NULL) {
|
||||
SDL_ClearError();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef SDL_VIDEO_STATIC_ANGLE
|
||||
/* A funny thing, loading EGL.so first does not work on the Raspberry, so we load libGL* first */
|
||||
path = SDL_getenv("SDL_VIDEO_GL_DRIVER");
|
||||
if (path != NULL) {
|
||||
|
|
@ -200,6 +304,13 @@ SDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_displa
|
|||
if (_this->gl_config.major_version > 1) {
|
||||
path = DEFAULT_OGL_ES2;
|
||||
egl_dll_handle = SDL_LoadObject(path);
|
||||
#ifdef ALT_OGL_ES2
|
||||
if (egl_dll_handle == NULL && !vc4) {
|
||||
path = ALT_OGL_ES2;
|
||||
egl_dll_handle = SDL_LoadObject(path);
|
||||
}
|
||||
#endif
|
||||
|
||||
} else {
|
||||
path = DEFAULT_OGL_ES;
|
||||
egl_dll_handle = SDL_LoadObject(path);
|
||||
|
|
@ -207,6 +318,12 @@ SDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_displa
|
|||
path = DEFAULT_OGL_ES_PVR;
|
||||
egl_dll_handle = SDL_LoadObject(path);
|
||||
}
|
||||
#ifdef ALT_OGL_ES2
|
||||
if (egl_dll_handle == NULL && !vc4) {
|
||||
path = ALT_OGL_ES2;
|
||||
egl_dll_handle = SDL_LoadObject(path);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#ifdef DEFAULT_OGL
|
||||
|
|
@ -236,6 +353,14 @@ SDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_displa
|
|||
path = DEFAULT_EGL;
|
||||
}
|
||||
dll_handle = SDL_LoadObject(path);
|
||||
|
||||
#ifdef ALT_EGL
|
||||
if (dll_handle == NULL && !vc4) {
|
||||
path = ALT_EGL;
|
||||
dll_handle = SDL_LoadObject(path);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (dll_handle == NULL || SDL_LoadFunction(dll_handle, "eglChooseConfig") == NULL) {
|
||||
if (dll_handle != NULL) {
|
||||
SDL_UnloadObject(dll_handle);
|
||||
|
|
@ -244,6 +369,7 @@ SDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_displa
|
|||
}
|
||||
SDL_ClearError();
|
||||
}
|
||||
#endif
|
||||
|
||||
_this->egl_data->dll_handle = dll_handle;
|
||||
|
||||
|
|
@ -256,6 +382,7 @@ SDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_displa
|
|||
LOAD_FUNC(eglGetConfigAttrib);
|
||||
LOAD_FUNC(eglCreateContext);
|
||||
LOAD_FUNC(eglDestroyContext);
|
||||
LOAD_FUNC(eglCreatePbufferSurface);
|
||||
LOAD_FUNC(eglCreateWindowSurface);
|
||||
LOAD_FUNC(eglDestroySurface);
|
||||
LOAD_FUNC(eglMakeCurrent);
|
||||
|
|
@ -265,10 +392,43 @@ SDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_displa
|
|||
LOAD_FUNC(eglWaitGL);
|
||||
LOAD_FUNC(eglBindAPI);
|
||||
LOAD_FUNC(eglQueryString);
|
||||
|
||||
LOAD_FUNC(eglGetError);
|
||||
|
||||
if (_this->egl_data->eglQueryString) {
|
||||
/* EGL 1.5 allows querying for client version */
|
||||
const char *egl_version = _this->egl_data->eglQueryString(EGL_NO_DISPLAY, EGL_VERSION);
|
||||
if (egl_version != NULL) {
|
||||
if (SDL_sscanf(egl_version, "%d.%d", &egl_version_major, &egl_version_minor) != 2) {
|
||||
egl_version_major = 0;
|
||||
egl_version_minor = 0;
|
||||
SDL_LogWarn(SDL_LOG_CATEGORY_VIDEO, "Could not parse EGL version string: %s", egl_version);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (egl_version_major == 1 && egl_version_minor == 5) {
|
||||
LOAD_FUNC(eglGetPlatformDisplay);
|
||||
}
|
||||
|
||||
_this->egl_data->egl_display = EGL_NO_DISPLAY;
|
||||
#if !defined(__WINRT__)
|
||||
_this->egl_data->egl_display = _this->egl_data->eglGetDisplay(native_display);
|
||||
if (!_this->egl_data->egl_display) {
|
||||
if (platform) {
|
||||
if (egl_version_major == 1 && egl_version_minor == 5) {
|
||||
_this->egl_data->egl_display = _this->egl_data->eglGetPlatformDisplay(platform, (void *)(size_t)native_display, NULL);
|
||||
} else {
|
||||
if (SDL_EGL_HasExtension(_this, SDL_EGL_CLIENT_EXTENSION, "EGL_EXT_platform_base")) {
|
||||
_this->egl_data->eglGetPlatformDisplayEXT = SDL_EGL_GetProcAddress(_this, "eglGetPlatformDisplayEXT");
|
||||
if (_this->egl_data->eglGetPlatformDisplayEXT) {
|
||||
_this->egl_data->egl_display = _this->egl_data->eglGetPlatformDisplayEXT(platform, (void *)(size_t)native_display, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Try the implementation-specific eglGetDisplay even if eglGetPlatformDisplay fails */
|
||||
if (_this->egl_data->egl_display == EGL_NO_DISPLAY) {
|
||||
_this->egl_data->egl_display = _this->egl_data->eglGetDisplay(native_display);
|
||||
}
|
||||
if (_this->egl_data->egl_display == EGL_NO_DISPLAY) {
|
||||
return SDL_SetError("Could not get EGL display");
|
||||
}
|
||||
|
||||
|
|
@ -277,8 +437,6 @@ SDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_displa
|
|||
}
|
||||
#endif
|
||||
|
||||
_this->gl_config.driver_loaded = 1;
|
||||
|
||||
if (path) {
|
||||
SDL_strlcpy(_this->gl_config.driver_path, path, sizeof(_this->gl_config.driver_path) - 1);
|
||||
} else {
|
||||
|
|
@ -291,13 +449,19 @@ SDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_displa
|
|||
int
|
||||
SDL_EGL_ChooseConfig(_THIS)
|
||||
{
|
||||
/* 64 seems nice. */
|
||||
/* 64 seems nice. */
|
||||
EGLint attribs[64];
|
||||
EGLint found_configs = 0, value;
|
||||
#ifdef SDL_VIDEO_DRIVER_KMSDRM
|
||||
/* Intel EGL on KMS/DRM (al least) returns invalid configs that confuse the bitdiff search used */
|
||||
/* later in this function, so we simply use the first one when using the KMSDRM driver for now. */
|
||||
EGLConfig configs[1];
|
||||
#else
|
||||
/* 128 seems even nicer here */
|
||||
EGLConfig configs[128];
|
||||
#endif
|
||||
int i, j, best_bitdiff = -1, bitdiff;
|
||||
|
||||
|
||||
if (!_this->egl_data) {
|
||||
/* The EGL library wasn't loaded, SDL_GetError() should have info */
|
||||
return -1;
|
||||
|
|
@ -340,23 +504,11 @@ SDL_EGL_ChooseConfig(_THIS)
|
|||
attribs[i++] = _this->gl_config.multisamplesamples;
|
||||
}
|
||||
|
||||
if (_this->gl_config.framebuffer_srgb_capable) {
|
||||
#ifdef EGL_KHR_gl_colorspace
|
||||
if (SDL_EGL_HasExtension(_this, "EGL_KHR_gl_colorspace")) {
|
||||
attribs[i++] = EGL_GL_COLORSPACE_KHR;
|
||||
attribs[i++] = EGL_GL_COLORSPACE_SRGB_KHR;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
return SDL_SetError("EGL implementation does not support sRGB system framebuffers");
|
||||
}
|
||||
}
|
||||
|
||||
attribs[i++] = EGL_RENDERABLE_TYPE;
|
||||
if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) {
|
||||
#ifdef EGL_KHR_create_context
|
||||
if (_this->gl_config.major_version >= 3 &&
|
||||
SDL_EGL_HasExtension(_this, "EGL_KHR_create_context")) {
|
||||
SDL_EGL_HasExtension(_this, SDL_EGL_DISPLAY_EXTENSION, "EGL_KHR_create_context")) {
|
||||
attribs[i++] = EGL_OPENGL_ES3_BIT_KHR;
|
||||
} else
|
||||
#endif
|
||||
|
|
@ -371,6 +523,11 @@ SDL_EGL_ChooseConfig(_THIS)
|
|||
_this->egl_data->eglBindAPI(EGL_OPENGL_API);
|
||||
}
|
||||
|
||||
if (_this->egl_data->egl_surfacetype) {
|
||||
attribs[i++] = EGL_SURFACE_TYPE;
|
||||
attribs[i++] = _this->egl_data->egl_surfacetype;
|
||||
}
|
||||
|
||||
attribs[i++] = EGL_NONE;
|
||||
|
||||
if (_this->egl_data->eglChooseConfig(_this->egl_data->egl_display,
|
||||
|
|
@ -378,7 +535,7 @@ SDL_EGL_ChooseConfig(_THIS)
|
|||
configs, SDL_arraysize(configs),
|
||||
&found_configs) == EGL_FALSE ||
|
||||
found_configs == 0) {
|
||||
return SDL_SetError("Couldn't find matching EGL config");
|
||||
return SDL_EGL_SetError("Couldn't find matching EGL config", "eglChooseConfig");
|
||||
}
|
||||
|
||||
/* eglChooseConfig returns a number of configurations that match or exceed the requested attribs. */
|
||||
|
|
@ -458,7 +615,7 @@ SDL_EGL_CreateContext(_THIS, EGLSurface egl_surface)
|
|||
/* The Major/minor version, context profiles, and context flags can
|
||||
* only be specified when this extension is available.
|
||||
*/
|
||||
if (SDL_EGL_HasExtension(_this, "EGL_KHR_create_context")) {
|
||||
if (SDL_EGL_HasExtension(_this, SDL_EGL_DISPLAY_EXTENSION, "EGL_KHR_create_context")) {
|
||||
attribs[attr++] = EGL_CONTEXT_MAJOR_VERSION_KHR;
|
||||
attribs[attr++] = major_version;
|
||||
attribs[attr++] = EGL_CONTEXT_MINOR_VERSION_KHR;
|
||||
|
|
@ -483,6 +640,19 @@ SDL_EGL_CreateContext(_THIS, EGLSurface egl_surface)
|
|||
}
|
||||
}
|
||||
|
||||
if (_this->gl_config.no_error) {
|
||||
#ifdef EGL_KHR_create_context_no_error
|
||||
if (SDL_EGL_HasExtension(_this, SDL_EGL_DISPLAY_EXTENSION, "EGL_KHR_create_context_no_error")) {
|
||||
attribs[attr++] = EGL_CONTEXT_OPENGL_NO_ERROR_KHR;
|
||||
attribs[attr++] = _this->gl_config.no_error;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
SDL_SetError("EGL implementation does not support no_error contexts");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
attribs[attr++] = EGL_NONE;
|
||||
|
||||
/* Bind the API */
|
||||
|
|
@ -497,15 +667,23 @@ SDL_EGL_CreateContext(_THIS, EGLSurface egl_surface)
|
|||
share_context, attribs);
|
||||
|
||||
if (egl_context == EGL_NO_CONTEXT) {
|
||||
SDL_SetError("Could not create EGL context");
|
||||
SDL_EGL_SetError("Could not create EGL context", "eglCreateContext");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
_this->egl_data->egl_swapinterval = 0;
|
||||
|
||||
if (SDL_EGL_MakeCurrent(_this, egl_surface, egl_context) < 0) {
|
||||
/* Save the SDL error set by SDL_EGL_MakeCurrent */
|
||||
char errorText[1024];
|
||||
SDL_strlcpy(errorText, SDL_GetError(), SDL_arraysize(errorText));
|
||||
|
||||
/* Delete the context, which may alter the value returned by SDL_GetError() */
|
||||
SDL_EGL_DeleteContext(_this, egl_context);
|
||||
SDL_SetError("Could not make EGL context current");
|
||||
|
||||
/* Restore the SDL error */
|
||||
SDL_SetError("%s", errorText);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
@ -529,7 +707,7 @@ SDL_EGL_MakeCurrent(_THIS, EGLSurface egl_surface, SDL_GLContext context)
|
|||
} else {
|
||||
if (!_this->egl_data->eglMakeCurrent(_this->egl_data->egl_display,
|
||||
egl_surface, egl_surface, egl_context)) {
|
||||
return SDL_SetError("Unable to make EGL context current");
|
||||
return SDL_EGL_SetError("Unable to make EGL context current", "eglMakeCurrent");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -551,7 +729,7 @@ SDL_EGL_SetSwapInterval(_THIS, int interval)
|
|||
return 0;
|
||||
}
|
||||
|
||||
return SDL_SetError("Unable to set the EGL swap interval");
|
||||
return SDL_EGL_SetError("Unable to set the EGL swap interval", "eglSwapInterval");
|
||||
}
|
||||
|
||||
int
|
||||
|
|
@ -565,10 +743,13 @@ SDL_EGL_GetSwapInterval(_THIS)
|
|||
return _this->egl_data->egl_swapinterval;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
SDL_EGL_SwapBuffers(_THIS, EGLSurface egl_surface)
|
||||
{
|
||||
_this->egl_data->eglSwapBuffers(_this->egl_data->egl_display, egl_surface);
|
||||
if (!_this->egl_data->eglSwapBuffers(_this->egl_data->egl_display, egl_surface)) {
|
||||
return SDL_EGL_SetError("unable to show color buffer in an OS-native window", "eglSwapBuffers");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -591,11 +772,17 @@ SDL_EGL_DeleteContext(_THIS, SDL_GLContext context)
|
|||
EGLSurface *
|
||||
SDL_EGL_CreateSurface(_THIS, NativeWindowType nw)
|
||||
{
|
||||
/* max 2 values plus terminator. */
|
||||
EGLint attribs[3];
|
||||
int attr = 0;
|
||||
|
||||
EGLSurface * surface;
|
||||
|
||||
if (SDL_EGL_ChooseConfig(_this) != 0) {
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
|
||||
#if __ANDROID__
|
||||
#if SDL_VIDEO_DRIVER_ANDROID
|
||||
{
|
||||
/* Android docs recommend doing this!
|
||||
* Ref: http://developer.android.com/reference/android/app/NativeActivity.html
|
||||
|
|
@ -608,11 +795,29 @@ SDL_EGL_CreateSurface(_THIS, NativeWindowType nw)
|
|||
ANativeWindow_setBuffersGeometry(nw, 0, 0, format);
|
||||
}
|
||||
#endif
|
||||
if (_this->gl_config.framebuffer_srgb_capable) {
|
||||
#ifdef EGL_KHR_gl_colorspace
|
||||
if (SDL_EGL_HasExtension(_this, SDL_EGL_DISPLAY_EXTENSION, "EGL_KHR_gl_colorspace")) {
|
||||
attribs[attr++] = EGL_GL_COLORSPACE_KHR;
|
||||
attribs[attr++] = EGL_GL_COLORSPACE_SRGB_KHR;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
SDL_SetError("EGL implementation does not support sRGB system framebuffers");
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
}
|
||||
|
||||
attribs[attr++] = EGL_NONE;
|
||||
|
||||
return _this->egl_data->eglCreateWindowSurface(
|
||||
surface = _this->egl_data->eglCreateWindowSurface(
|
||||
_this->egl_data->egl_display,
|
||||
_this->egl_data->egl_config,
|
||||
nw, NULL);
|
||||
nw, &attribs[0]);
|
||||
if (surface == EGL_NO_SURFACE) {
|
||||
SDL_EGL_SetError("unable to create an EGL window surface", "eglCreateWindowSurface");
|
||||
}
|
||||
return surface;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -630,4 +835,4 @@ SDL_EGL_DestroySurface(_THIS, EGLSurface egl_surface)
|
|||
#endif /* SDL_VIDEO_OPENGL_EGL */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -20,8 +20,8 @@
|
|||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_egl_h
|
||||
#define _SDL_egl_h
|
||||
#ifndef SDL_egl_h_
|
||||
#define SDL_egl_h_
|
||||
|
||||
#if SDL_VIDEO_OPENGL_EGL
|
||||
|
||||
|
|
@ -35,8 +35,15 @@ typedef struct SDL_EGL_VideoData
|
|||
EGLDisplay egl_display;
|
||||
EGLConfig egl_config;
|
||||
int egl_swapinterval;
|
||||
int egl_surfacetype;
|
||||
|
||||
EGLDisplay(EGLAPIENTRY *eglGetDisplay) (NativeDisplayType display);
|
||||
EGLDisplay(EGLAPIENTRY *eglGetPlatformDisplay) (EGLenum platform,
|
||||
void *native_display,
|
||||
const EGLint *attrib_list);
|
||||
EGLDisplay(EGLAPIENTRY *eglGetPlatformDisplayEXT) (EGLenum platform,
|
||||
void *native_display,
|
||||
const EGLint *attrib_list);
|
||||
EGLBoolean(EGLAPIENTRY *eglInitialize) (EGLDisplay dpy, EGLint * major,
|
||||
EGLint * minor);
|
||||
EGLBoolean(EGLAPIENTRY *eglTerminate) (EGLDisplay dpy);
|
||||
|
|
@ -55,6 +62,9 @@ typedef struct SDL_EGL_VideoData
|
|||
|
||||
EGLBoolean(EGLAPIENTRY *eglDestroyContext) (EGLDisplay dpy, EGLContext ctx);
|
||||
|
||||
EGLSurface(EGLAPIENTRY *eglCreatePbufferSurface)(EGLDisplay dpy, EGLConfig config,
|
||||
EGLint const* attrib_list);
|
||||
|
||||
EGLSurface(EGLAPIENTRY *eglCreateWindowSurface) (EGLDisplay dpy,
|
||||
EGLConfig config,
|
||||
NativeWindowType window,
|
||||
|
|
@ -79,11 +89,16 @@ typedef struct SDL_EGL_VideoData
|
|||
|
||||
EGLBoolean(EGLAPIENTRY *eglBindAPI)(EGLenum);
|
||||
|
||||
EGLint(EGLAPIENTRY *eglGetError)(void);
|
||||
|
||||
} SDL_EGL_VideoData;
|
||||
|
||||
/* OpenGLES functions */
|
||||
extern int SDL_EGL_GetAttribute(_THIS, SDL_GLattr attrib, int *value);
|
||||
extern int SDL_EGL_LoadLibrary(_THIS, const char *path, NativeDisplayType native_display);
|
||||
/* SDL_EGL_LoadLibrary can get a display for a specific platform (EGL_PLATFORM_*)
|
||||
* or, if 0 is passed, let the implementation decide.
|
||||
*/
|
||||
extern int SDL_EGL_LoadLibrary(_THIS, const char *path, NativeDisplayType native_display, EGLenum platform);
|
||||
extern void *SDL_EGL_GetProcAddress(_THIS, const char *proc);
|
||||
extern void SDL_EGL_UnloadLibrary(_THIS);
|
||||
extern int SDL_EGL_ChooseConfig(_THIS);
|
||||
|
|
@ -96,14 +111,18 @@ extern void SDL_EGL_DestroySurface(_THIS, EGLSurface egl_surface);
|
|||
/* These need to be wrapped to get the surface for the window by the platform GLES implementation */
|
||||
extern SDL_GLContext SDL_EGL_CreateContext(_THIS, EGLSurface egl_surface);
|
||||
extern int SDL_EGL_MakeCurrent(_THIS, EGLSurface egl_surface, SDL_GLContext context);
|
||||
extern void SDL_EGL_SwapBuffers(_THIS, EGLSurface egl_surface);
|
||||
extern int SDL_EGL_SwapBuffers(_THIS, EGLSurface egl_surface);
|
||||
|
||||
/* SDL Error-reporting */
|
||||
extern int SDL_EGL_SetErrorEx(const char * message, const char * eglFunctionName, EGLint eglErrorCode);
|
||||
#define SDL_EGL_SetError(message, eglFunctionName) SDL_EGL_SetErrorEx(message, eglFunctionName, _this->egl_data->eglGetError())
|
||||
|
||||
/* A few of useful macros */
|
||||
|
||||
#define SDL_EGL_SwapWindow_impl(BACKEND) void \
|
||||
#define SDL_EGL_SwapWindow_impl(BACKEND) int \
|
||||
BACKEND ## _GLES_SwapWindow(_THIS, SDL_Window * window) \
|
||||
{\
|
||||
SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);\
|
||||
return SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);\
|
||||
}
|
||||
|
||||
#define SDL_EGL_MakeCurrent_impl(BACKEND) int \
|
||||
|
|
@ -125,6 +144,6 @@ BACKEND ## _GLES_CreateContext(_THIS, SDL_Window * window) \
|
|||
|
||||
#endif /* SDL_VIDEO_OPENGL_EGL */
|
||||
|
||||
#endif /* _SDL_egl_h */
|
||||
#endif /* SDL_egl_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -144,13 +144,13 @@ SDL_FillRect1(Uint8 * pixels, int pitch, Uint32 color, int w, int h)
|
|||
switch ((uintptr_t) p & 3) {
|
||||
case 1:
|
||||
*p++ = (Uint8) color;
|
||||
--n;
|
||||
--n; /* fallthrough */
|
||||
case 2:
|
||||
*p++ = (Uint8) color;
|
||||
--n;
|
||||
--n; /* fallthrough */
|
||||
case 3:
|
||||
*p++ = (Uint8) color;
|
||||
--n;
|
||||
--n; /* fallthrough */
|
||||
}
|
||||
SDL_memset4(p, color, (n >> 2));
|
||||
}
|
||||
|
|
@ -158,11 +158,11 @@ SDL_FillRect1(Uint8 * pixels, int pitch, Uint32 color, int w, int h)
|
|||
p += (n & ~3);
|
||||
switch (n & 3) {
|
||||
case 3:
|
||||
*p++ = (Uint8) color;
|
||||
*p++ = (Uint8) color; /* fallthrough */
|
||||
case 2:
|
||||
*p++ = (Uint8) color;
|
||||
*p++ = (Uint8) color; /* fallthrough */
|
||||
case 1:
|
||||
*p++ = (Uint8) color;
|
||||
*p++ = (Uint8) color; /* fallthrough */
|
||||
}
|
||||
}
|
||||
pixels += pitch;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -326,7 +326,7 @@ SDL_MasksToPixelFormatEnum(int bpp, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask,
|
|||
if (Rmask == 0) {
|
||||
return SDL_PIXELFORMAT_RGB555;
|
||||
}
|
||||
/* Fall through to 16-bit checks */
|
||||
/* fallthrough */
|
||||
case 16:
|
||||
if (Rmask == 0) {
|
||||
return SDL_PIXELFORMAT_RGB565;
|
||||
|
|
@ -403,6 +403,13 @@ SDL_MasksToPixelFormatEnum(int bpp, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask,
|
|||
Amask == 0x0000) {
|
||||
return SDL_PIXELFORMAT_BGR565;
|
||||
}
|
||||
if (Rmask == 0x003F &&
|
||||
Gmask == 0x07C0 &&
|
||||
Bmask == 0xF800 &&
|
||||
Amask == 0x0000) {
|
||||
/* Technically this would be BGR556, but Witek says this works in bug 3158 */
|
||||
return SDL_PIXELFORMAT_RGB565;
|
||||
}
|
||||
break;
|
||||
case 24:
|
||||
switch (Rmask) {
|
||||
|
|
@ -483,16 +490,20 @@ SDL_MasksToPixelFormatEnum(int bpp, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask,
|
|||
}
|
||||
|
||||
static SDL_PixelFormat *formats;
|
||||
static SDL_SpinLock formats_lock = 0;
|
||||
|
||||
SDL_PixelFormat *
|
||||
SDL_AllocFormat(Uint32 pixel_format)
|
||||
{
|
||||
SDL_PixelFormat *format;
|
||||
|
||||
SDL_AtomicLock(&formats_lock);
|
||||
|
||||
/* Look it up in our list of previously allocated formats */
|
||||
for (format = formats; format; format = format->next) {
|
||||
if (pixel_format == format->format) {
|
||||
++format->refcount;
|
||||
SDL_AtomicUnlock(&formats_lock);
|
||||
return format;
|
||||
}
|
||||
}
|
||||
|
|
@ -500,10 +511,12 @@ SDL_AllocFormat(Uint32 pixel_format)
|
|||
/* Allocate an empty pixel format structure, and initialize it */
|
||||
format = SDL_malloc(sizeof(*format));
|
||||
if (format == NULL) {
|
||||
SDL_AtomicUnlock(&formats_lock);
|
||||
SDL_OutOfMemory();
|
||||
return NULL;
|
||||
}
|
||||
if (SDL_InitFormat(format, pixel_format) < 0) {
|
||||
SDL_AtomicUnlock(&formats_lock);
|
||||
SDL_free(format);
|
||||
SDL_InvalidParamError("format");
|
||||
return NULL;
|
||||
|
|
@ -514,6 +527,9 @@ SDL_AllocFormat(Uint32 pixel_format)
|
|||
format->next = formats;
|
||||
formats = format;
|
||||
}
|
||||
|
||||
SDL_AtomicUnlock(&formats_lock);
|
||||
|
||||
return format;
|
||||
}
|
||||
|
||||
|
|
@ -591,7 +607,11 @@ SDL_FreeFormat(SDL_PixelFormat *format)
|
|||
SDL_InvalidParamError("format");
|
||||
return;
|
||||
}
|
||||
|
||||
SDL_AtomicLock(&formats_lock);
|
||||
|
||||
if (--format->refcount > 0) {
|
||||
SDL_AtomicUnlock(&formats_lock);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -607,6 +627,8 @@ SDL_FreeFormat(SDL_PixelFormat *format)
|
|||
}
|
||||
}
|
||||
|
||||
SDL_AtomicUnlock(&formats_lock);
|
||||
|
||||
if (format->palette) {
|
||||
SDL_FreePalette(format->palette);
|
||||
}
|
||||
|
|
@ -651,7 +673,7 @@ SDL_SetPixelFormatPalette(SDL_PixelFormat * format, SDL_Palette *palette)
|
|||
return SDL_SetError("SDL_SetPixelFormatPalette() passed NULL format");
|
||||
}
|
||||
|
||||
if (palette && palette->ncolors != (1 << format->BitsPerPixel)) {
|
||||
if (palette && palette->ncolors > (1 << format->BitsPerPixel)) {
|
||||
return SDL_SetError("SDL_SetPixelFormatPalette() passed a palette that doesn't match the format");
|
||||
}
|
||||
|
||||
|
|
@ -741,30 +763,6 @@ SDL_DitherColors(SDL_Color * colors, int bpp)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate the pad-aligned scanline width of a surface
|
||||
*/
|
||||
int
|
||||
SDL_CalculatePitch(SDL_Surface * surface)
|
||||
{
|
||||
int pitch;
|
||||
|
||||
/* Surface should be 4-byte aligned for speed */
|
||||
pitch = surface->w * surface->format->BytesPerPixel;
|
||||
switch (surface->format->BitsPerPixel) {
|
||||
case 1:
|
||||
pitch = (pitch + 7) / 8;
|
||||
break;
|
||||
case 4:
|
||||
pitch = (pitch + 1) / 2;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
pitch = (pitch + 3) & ~3; /* 4-byte aligning */
|
||||
return (pitch);
|
||||
}
|
||||
|
||||
/*
|
||||
* Match an RGB value to a particular palette index
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -34,7 +34,6 @@ extern int SDL_MapSurface(SDL_Surface * src, SDL_Surface * dst);
|
|||
extern void SDL_FreeBlitMap(SDL_BlitMap * map);
|
||||
|
||||
/* Miscellaneous functions */
|
||||
extern int SDL_CalculatePitch(SDL_Surface * surface);
|
||||
extern void SDL_DitherColors(SDL_Color * colors, int bpp);
|
||||
extern Uint8 SDL_FindColor(SDL_Palette * pal, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
|
||||
#include "SDL_rect.h"
|
||||
#include "SDL_rect_c.h"
|
||||
|
||||
#include "SDL_assert.h"
|
||||
|
||||
SDL_bool
|
||||
SDL_HasIntersection(const SDL_Rect * A, const SDL_Rect * B)
|
||||
|
|
@ -441,9 +441,15 @@ SDL_IntersectRectAndLine(const SDL_Rect * rect, int *X1, int *Y1, int *X2,
|
|||
y = recty2;
|
||||
x = x1 + ((x2 - x1) * (y - y1)) / (y2 - y1);
|
||||
} else if (outcode2 & CODE_LEFT) {
|
||||
/* If this assertion ever fires, here's the static analysis that warned about it:
|
||||
http://buildbot.libsdl.org/sdl-static-analysis/sdl-macosx-static-analysis/sdl-macosx-static-analysis-1101/report-b0d01a.html#EndPath */
|
||||
SDL_assert(x2 != x1); /* if equal: division by zero. */
|
||||
x = rectx1;
|
||||
y = y1 + ((y2 - y1) * (x - x1)) / (x2 - x1);
|
||||
} else if (outcode2 & CODE_RIGHT) {
|
||||
/* If this assertion ever fires, here's the static analysis that warned about it:
|
||||
http://buildbot.libsdl.org/sdl-static-analysis/sdl-macosx-static-analysis/sdl-macosx-static-analysis-1101/report-39b114.html#EndPath */
|
||||
SDL_assert(x2 != x1); /* if equal: division by zero. */
|
||||
x = rectx2;
|
||||
y = y1 + ((y2 - y1) * (x - x1)) / (x2 - x1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -35,6 +35,10 @@ SDL_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned
|
|||
SDL_Window *result = NULL;
|
||||
result = SDL_CreateWindow(title,-1000,-1000,w,h,(flags | SDL_WINDOW_BORDERLESS) & (~SDL_WINDOW_FULLSCREEN) & (~SDL_WINDOW_RESIZABLE) /* & (~SDL_WINDOW_SHOWN) */);
|
||||
if(result != NULL) {
|
||||
if (SDL_GetVideoDevice()->shape_driver.CreateShaper == NULL) {
|
||||
SDL_DestroyWindow(result);
|
||||
return NULL;
|
||||
}
|
||||
result->shaper = SDL_GetVideoDevice()->shape_driver.CreateShaper(result);
|
||||
if(result->shaper != NULL) {
|
||||
result->shaper->userx = x;
|
||||
|
|
@ -70,11 +74,14 @@ SDL_CalculateShapeBitmap(SDL_WindowShapeMode mode,SDL_Surface *shape,Uint8* bitm
|
|||
int y = 0;
|
||||
Uint8 r = 0,g = 0,b = 0,alpha = 0;
|
||||
Uint8* pixel = NULL;
|
||||
Uint32 bitmap_pixel,pixel_value = 0,mask_value = 0;
|
||||
Uint32 pixel_value = 0,mask_value = 0;
|
||||
int bytes_per_scanline = (shape->w + (ppb - 1)) / ppb;
|
||||
Uint8 *bitmap_scanline;
|
||||
SDL_Color key;
|
||||
if(SDL_MUSTLOCK(shape))
|
||||
SDL_LockSurface(shape);
|
||||
for(y = 0;y<shape->h;y++) {
|
||||
bitmap_scanline = bitmap + y * bytes_per_scanline;
|
||||
for(x=0;x<shape->w;x++) {
|
||||
alpha = 0;
|
||||
pixel_value = 0;
|
||||
|
|
@ -94,7 +101,6 @@ SDL_CalculateShapeBitmap(SDL_WindowShapeMode mode,SDL_Surface *shape,Uint8* bitm
|
|||
break;
|
||||
}
|
||||
SDL_GetRGBA(pixel_value,shape->format,&r,&g,&b,&alpha);
|
||||
bitmap_pixel = y*shape->w + x;
|
||||
switch(mode.mode) {
|
||||
case(ShapeModeDefault):
|
||||
mask_value = (alpha >= 1 ? 1 : 0);
|
||||
|
|
@ -110,7 +116,7 @@ SDL_CalculateShapeBitmap(SDL_WindowShapeMode mode,SDL_Surface *shape,Uint8* bitm
|
|||
mask_value = ((key.r != r || key.g != g || key.b != b) ? 1 : 0);
|
||||
break;
|
||||
}
|
||||
bitmap[bitmap_pixel / ppb] |= mask_value << (7 - ((ppb - 1) - (bitmap_pixel % ppb)));
|
||||
bitmap_scanline[x / ppb] |= mask_value << (x % ppb);
|
||||
}
|
||||
}
|
||||
if(SDL_MUSTLOCK(shape))
|
||||
|
|
@ -206,8 +212,14 @@ RecursivelyCalculateShapeTree(SDL_WindowShapeMode mode,SDL_Surface* mask,SDL_Rec
|
|||
SDL_ShapeTree*
|
||||
SDL_CalculateShapeTree(SDL_WindowShapeMode mode,SDL_Surface* shape)
|
||||
{
|
||||
SDL_Rect dimensions = {0,0,shape->w,shape->h};
|
||||
SDL_Rect dimensions;
|
||||
SDL_ShapeTree* result = NULL;
|
||||
|
||||
dimensions.x = 0;
|
||||
dimensions.y = 0;
|
||||
dimensions.w = shape->w;
|
||||
dimensions.h = shape->h;
|
||||
|
||||
if(SDL_MUSTLOCK(shape))
|
||||
SDL_LockSurface(shape);
|
||||
result = RecursivelyCalculateShapeTree(mode,shape,dimensions);
|
||||
|
|
@ -234,10 +246,10 @@ void
|
|||
SDL_FreeShapeTree(SDL_ShapeTree** shape_tree)
|
||||
{
|
||||
if((*shape_tree)->kind == QuadShape) {
|
||||
SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.upleft);
|
||||
SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.upright);
|
||||
SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.downleft);
|
||||
SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.downright);
|
||||
SDL_FreeShapeTree((SDL_ShapeTree **)(char*)&(*shape_tree)->data.children.upleft);
|
||||
SDL_FreeShapeTree((SDL_ShapeTree **)(char*)&(*shape_tree)->data.children.upright);
|
||||
SDL_FreeShapeTree((SDL_ShapeTree **)(char*)&(*shape_tree)->data.children.downleft);
|
||||
SDL_FreeShapeTree((SDL_ShapeTree **)(char*)&(*shape_tree)->data.children.downright);
|
||||
}
|
||||
SDL_free(*shape_tree);
|
||||
*shape_tree = NULL;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -20,8 +20,8 @@
|
|||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_shape_internals_h
|
||||
#define _SDL_shape_internals_h
|
||||
#ifndef SDL_shape_internals_h_
|
||||
#define SDL_shape_internals_h_
|
||||
|
||||
#include "SDL_rect.h"
|
||||
#include "SDL_shape.h"
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -33,8 +33,8 @@
|
|||
into the general blitting mechanism.
|
||||
*/
|
||||
|
||||
#if ((defined(_MFC_VER) && defined(_M_IX86)) || \
|
||||
defined(__WATCOMC__) || \
|
||||
#if ((defined(_MSC_VER) && defined(_M_IX86)) || \
|
||||
(defined(__WATCOMC__) && defined(__386__)) || \
|
||||
(defined(__GNUC__) && defined(__i386__))) && SDL_ASSEMBLY_ROUTINES
|
||||
/* There's a bug with gcc 4.4.1 and -O2 where srcp doesn't get the correct
|
||||
* value after the first scanline. FIXME? */
|
||||
|
|
@ -53,7 +53,7 @@
|
|||
#define PAGE_ALIGNED
|
||||
#endif
|
||||
|
||||
#if defined(_M_IX86) || defined(i386)
|
||||
#if defined(_M_IX86) || defined(__i386__) || defined(__386__)
|
||||
#define PREFIX16 0x66
|
||||
#define STORE_BYTE 0xAA
|
||||
#define STORE_WORD 0xAB
|
||||
|
|
@ -102,7 +102,7 @@ generate_rowbytes(int src_w, int dst_w, int bpp)
|
|||
store = STORE_WORD;
|
||||
break;
|
||||
default:
|
||||
return SDL_SetError("ASM stretch of %d bytes isn't supported\n", bpp);
|
||||
return SDL_SetError("ASM stretch of %d bytes isn't supported", bpp);
|
||||
}
|
||||
#ifdef HAVE_MPROTECT
|
||||
/* Make the code writeable */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -25,9 +25,39 @@
|
|||
#include "SDL_blit.h"
|
||||
#include "SDL_RLEaccel_c.h"
|
||||
#include "SDL_pixels_c.h"
|
||||
#include "SDL_yuv_c.h"
|
||||
|
||||
|
||||
/* Check to make sure we can safely check multiplication of surface w and pitch and it won't overflow size_t */
|
||||
SDL_COMPILE_TIME_ASSERT(surface_size_assumptions,
|
||||
sizeof(int) == sizeof(Sint32) && sizeof(size_t) >= sizeof(Sint32));
|
||||
|
||||
/* Public routines */
|
||||
|
||||
/*
|
||||
* Calculate the pad-aligned scanline width of a surface
|
||||
*/
|
||||
int
|
||||
SDL_CalculatePitch(Uint32 format, int width)
|
||||
{
|
||||
int pitch;
|
||||
|
||||
/* Surface should be 4-byte aligned for speed */
|
||||
pitch = width * SDL_BYTESPERPIXEL(format);
|
||||
switch (SDL_BITSPERPIXEL(format)) {
|
||||
case 1:
|
||||
pitch = (pitch + 7) / 8;
|
||||
break;
|
||||
case 4:
|
||||
pitch = (pitch + 1) / 2;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
pitch = (pitch + 3) & ~3; /* 4-byte aligning */
|
||||
return pitch;
|
||||
}
|
||||
|
||||
/*
|
||||
* Create an empty RGB surface of the appropriate depth using the given
|
||||
* enum SDL_PIXELFORMAT_* format
|
||||
|
|
@ -55,7 +85,7 @@ SDL_CreateRGBSurfaceWithFormat(Uint32 flags, int width, int height, int depth,
|
|||
}
|
||||
surface->w = width;
|
||||
surface->h = height;
|
||||
surface->pitch = SDL_CalculatePitch(surface);
|
||||
surface->pitch = SDL_CalculatePitch(format, width);
|
||||
SDL_SetClipRect(surface, NULL);
|
||||
|
||||
if (SDL_ISPIXELFORMAT_INDEXED(surface->format->format)) {
|
||||
|
|
@ -80,7 +110,16 @@ SDL_CreateRGBSurfaceWithFormat(Uint32 flags, int width, int height, int depth,
|
|||
|
||||
/* Get the pixels */
|
||||
if (surface->w && surface->h) {
|
||||
surface->pixels = SDL_malloc(surface->h * surface->pitch);
|
||||
/* Assumptions checked in surface_size_assumptions assert above */
|
||||
Sint64 size = ((Sint64)surface->h * surface->pitch);
|
||||
if (size < 0 || size > SDL_MAX_SINT32) {
|
||||
/* Overflow... */
|
||||
SDL_FreeSurface(surface);
|
||||
SDL_OutOfMemory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
surface->pixels = SDL_malloc((size_t)size);
|
||||
if (!surface->pixels) {
|
||||
SDL_FreeSurface(surface);
|
||||
SDL_OutOfMemory();
|
||||
|
|
@ -257,11 +296,11 @@ int
|
|||
SDL_GetColorKey(SDL_Surface * surface, Uint32 * key)
|
||||
{
|
||||
if (!surface) {
|
||||
return -1;
|
||||
return SDL_InvalidParamError("surface");
|
||||
}
|
||||
|
||||
if (!(surface->map->info.flags & SDL_COPY_COLORKEY)) {
|
||||
return -1;
|
||||
return SDL_SetError("Surface doesn't have a colorkey");
|
||||
}
|
||||
|
||||
if (key) {
|
||||
|
|
@ -778,8 +817,8 @@ SDL_UpperBlitScaled(SDL_Surface * src, const SDL_Rect * srcrect,
|
|||
|
||||
final_src.x = (int)SDL_floor(src_x0 + 0.5);
|
||||
final_src.y = (int)SDL_floor(src_y0 + 0.5);
|
||||
final_src.w = (int)SDL_floor(src_x1 - src_x0 + 1.5);
|
||||
final_src.h = (int)SDL_floor(src_y1 - src_y0 + 1.5);
|
||||
final_src.w = (int)SDL_floor(src_x1 + 1 + 0.5) - (int)SDL_floor(src_x0 + 0.5);
|
||||
final_src.h = (int)SDL_floor(src_y1 + 1 + 0.5) - (int)SDL_floor(src_y0 + 0.5);
|
||||
|
||||
final_dst.x = (int)SDL_floor(dst_x0 + 0.5);
|
||||
final_dst.y = (int)SDL_floor(dst_y0 + 0.5);
|
||||
|
|
@ -870,6 +909,15 @@ SDL_UnlockSurface(SDL_Surface * surface)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Creates a new surface identical to the existing surface
|
||||
*/
|
||||
SDL_Surface *
|
||||
SDL_DuplicateSurface(SDL_Surface * surface)
|
||||
{
|
||||
return SDL_ConvertSurface(surface, surface->format, surface->flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert a surface into the specified pixel format.
|
||||
*/
|
||||
|
|
@ -882,6 +930,15 @@ SDL_ConvertSurface(SDL_Surface * surface, const SDL_PixelFormat * format,
|
|||
SDL_Color copy_color;
|
||||
SDL_Rect bounds;
|
||||
|
||||
if (!surface) {
|
||||
SDL_InvalidParamError("surface");
|
||||
return NULL;
|
||||
}
|
||||
if (!format) {
|
||||
SDL_InvalidParamError("format");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Check for empty destination palette! (results in empty image) */
|
||||
if (format->palette != NULL) {
|
||||
int i;
|
||||
|
|
@ -970,13 +1027,37 @@ SDL_ConvertSurface(SDL_Surface * surface, const SDL_PixelFormat * format,
|
|||
}
|
||||
|
||||
if (set_colorkey_by_color) {
|
||||
/* Set the colorkey by color, which needs to be unique */
|
||||
Uint8 keyR, keyG, keyB, keyA;
|
||||
SDL_Surface *tmp;
|
||||
SDL_Surface *tmp2;
|
||||
int converted_colorkey = 0;
|
||||
|
||||
/* Create a dummy surface to get the colorkey converted */
|
||||
tmp = SDL_CreateRGBSurface(0, 1, 1,
|
||||
surface->format->BitsPerPixel, surface->format->Rmask,
|
||||
surface->format->Gmask, surface->format->Bmask,
|
||||
surface->format->Amask);
|
||||
|
||||
/* Share the palette, if any */
|
||||
if (surface->format->palette) {
|
||||
SDL_SetSurfacePalette(tmp, surface->format->palette);
|
||||
}
|
||||
|
||||
SDL_FillRect(tmp, NULL, surface->map->info.colorkey);
|
||||
|
||||
tmp->map->info.flags &= ~SDL_COPY_COLORKEY;
|
||||
|
||||
/* Convertion of the colorkey */
|
||||
tmp2 = SDL_ConvertSurface(tmp, format, 0);
|
||||
|
||||
/* Get the converted colorkey */
|
||||
SDL_memcpy(&converted_colorkey, tmp2->pixels, tmp2->format->BytesPerPixel);
|
||||
|
||||
SDL_FreeSurface(tmp);
|
||||
SDL_FreeSurface(tmp2);
|
||||
|
||||
/* Set the converted colorkey on the new surface */
|
||||
SDL_SetColorKey(convert, 1, converted_colorkey);
|
||||
|
||||
SDL_GetRGBA(surface->map->info.colorkey, surface->format, &keyR,
|
||||
&keyG, &keyB, &keyA);
|
||||
SDL_SetColorKey(convert, 1,
|
||||
SDL_MapRGBA(convert->format, keyR, keyG, keyB, keyA));
|
||||
/* This is needed when converting for 3D texture upload */
|
||||
SDL_ConvertColorkeyToAlpha(convert);
|
||||
}
|
||||
|
|
@ -986,7 +1067,7 @@ SDL_ConvertSurface(SDL_Surface * surface, const SDL_PixelFormat * format,
|
|||
/* Enable alpha blending by default if the new surface has an
|
||||
* alpha channel or alpha modulation */
|
||||
if ((surface->format->Amask && format->Amask) ||
|
||||
(copy_flags & (SDL_COPY_COLORKEY|SDL_COPY_MODULATE_ALPHA))) {
|
||||
(copy_flags & SDL_COPY_MODULATE_ALPHA)) {
|
||||
SDL_SetSurfaceBlendMode(convert, SDL_BLENDMODE_BLEND);
|
||||
}
|
||||
if ((copy_flags & SDL_COPY_RLE_DESIRED) || (flags & SDL_RLEACCEL)) {
|
||||
|
|
@ -1072,57 +1153,24 @@ int SDL_ConvertPixels(int width, int height,
|
|||
return SDL_InvalidParamError("dst_pitch");
|
||||
}
|
||||
|
||||
if (SDL_ISPIXELFORMAT_FOURCC(src_format) && SDL_ISPIXELFORMAT_FOURCC(dst_format)) {
|
||||
return SDL_ConvertPixels_YUV_to_YUV(width, height, src_format, src, src_pitch, dst_format, dst, dst_pitch);
|
||||
} else if (SDL_ISPIXELFORMAT_FOURCC(src_format)) {
|
||||
return SDL_ConvertPixels_YUV_to_RGB(width, height, src_format, src, src_pitch, dst_format, dst, dst_pitch);
|
||||
} else if (SDL_ISPIXELFORMAT_FOURCC(dst_format)) {
|
||||
return SDL_ConvertPixels_RGB_to_YUV(width, height, src_format, src, src_pitch, dst_format, dst, dst_pitch);
|
||||
}
|
||||
|
||||
/* Fast path for same format copy */
|
||||
if (src_format == dst_format) {
|
||||
int bpp, i;
|
||||
|
||||
if (SDL_ISPIXELFORMAT_FOURCC(src_format)) {
|
||||
switch (src_format) {
|
||||
case SDL_PIXELFORMAT_YUY2:
|
||||
case SDL_PIXELFORMAT_UYVY:
|
||||
case SDL_PIXELFORMAT_YVYU:
|
||||
bpp = 2;
|
||||
break;
|
||||
case SDL_PIXELFORMAT_YV12:
|
||||
case SDL_PIXELFORMAT_IYUV:
|
||||
case SDL_PIXELFORMAT_NV12:
|
||||
case SDL_PIXELFORMAT_NV21:
|
||||
bpp = 1;
|
||||
break;
|
||||
default:
|
||||
return SDL_SetError("Unknown FOURCC pixel format");
|
||||
}
|
||||
} else {
|
||||
bpp = SDL_BYTESPERPIXEL(src_format);
|
||||
}
|
||||
int i;
|
||||
const int bpp = SDL_BYTESPERPIXEL(src_format);
|
||||
width *= bpp;
|
||||
|
||||
for (i = height; i--;) {
|
||||
SDL_memcpy(dst, src, width);
|
||||
src = (Uint8*)src + src_pitch;
|
||||
src = (const Uint8*)src + src_pitch;
|
||||
dst = (Uint8*)dst + dst_pitch;
|
||||
}
|
||||
|
||||
if (src_format == SDL_PIXELFORMAT_YV12 || src_format == SDL_PIXELFORMAT_IYUV) {
|
||||
/* U and V planes are a quarter the size of the Y plane */
|
||||
width /= 2;
|
||||
height /= 2;
|
||||
src_pitch /= 2;
|
||||
dst_pitch /= 2;
|
||||
for (i = height * 2; i--;) {
|
||||
SDL_memcpy(dst, src, width);
|
||||
src = (Uint8*)src + src_pitch;
|
||||
dst = (Uint8*)dst + dst_pitch;
|
||||
}
|
||||
} else if (src_format == SDL_PIXELFORMAT_NV12 || src_format == SDL_PIXELFORMAT_NV21) {
|
||||
/* U/V plane is half the height of the Y plane */
|
||||
height /= 2;
|
||||
for (i = height; i--;) {
|
||||
SDL_memcpy(dst, src, width);
|
||||
src = (Uint8*)src + src_pitch;
|
||||
dst = (Uint8*)dst + dst_pitch;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1156,6 +1204,8 @@ SDL_FreeSurface(SDL_Surface * surface)
|
|||
if (surface->flags & SDL_DONTFREE) {
|
||||
return;
|
||||
}
|
||||
SDL_InvalidateMap(surface->map);
|
||||
|
||||
if (--surface->refcount > 0) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -1170,13 +1220,12 @@ SDL_FreeSurface(SDL_Surface * surface)
|
|||
SDL_FreeFormat(surface->format);
|
||||
surface->format = NULL;
|
||||
}
|
||||
if (surface->map != NULL) {
|
||||
SDL_FreeBlitMap(surface->map);
|
||||
surface->map = NULL;
|
||||
}
|
||||
if (!(surface->flags & SDL_PREALLOC)) {
|
||||
SDL_free(surface->pixels);
|
||||
}
|
||||
if (surface->map) {
|
||||
SDL_FreeBlitMap(surface->map);
|
||||
}
|
||||
SDL_free(surface);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -20,13 +20,15 @@
|
|||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_sysvideo_h
|
||||
#define _SDL_sysvideo_h
|
||||
#ifndef SDL_sysvideo_h_
|
||||
#define SDL_sysvideo_h_
|
||||
|
||||
#include "SDL_messagebox.h"
|
||||
#include "SDL_shape.h"
|
||||
#include "SDL_thread.h"
|
||||
|
||||
#include "SDL_vulkan_internal.h"
|
||||
|
||||
/* The SDL video driver */
|
||||
|
||||
typedef struct SDL_WindowShaper SDL_WindowShaper;
|
||||
|
|
@ -163,6 +165,11 @@ struct SDL_VideoDevice
|
|||
*/
|
||||
void (*VideoQuit) (_THIS);
|
||||
|
||||
/*
|
||||
* Reinitialize the touch devices -- called if an unknown touch ID occurs.
|
||||
*/
|
||||
void (*ResetTouch) (_THIS);
|
||||
|
||||
/* * * */
|
||||
/*
|
||||
* Display functions
|
||||
|
|
@ -200,8 +207,8 @@ struct SDL_VideoDevice
|
|||
/*
|
||||
* Window functions
|
||||
*/
|
||||
int (*CreateWindow) (_THIS, SDL_Window * window);
|
||||
int (*CreateWindowFrom) (_THIS, SDL_Window * window, const void *data);
|
||||
int (*CreateSDLWindow) (_THIS, SDL_Window * window);
|
||||
int (*CreateSDLWindowFrom) (_THIS, SDL_Window * window, const void *data);
|
||||
void (*SetWindowTitle) (_THIS, SDL_Window * window);
|
||||
void (*SetWindowIcon) (_THIS, SDL_Window * window, SDL_Surface * icon);
|
||||
void (*SetWindowPosition) (_THIS, SDL_Window * window);
|
||||
|
|
@ -252,8 +259,19 @@ struct SDL_VideoDevice
|
|||
void (*GL_GetDrawableSize) (_THIS, SDL_Window * window, int *w, int *h);
|
||||
int (*GL_SetSwapInterval) (_THIS, int interval);
|
||||
int (*GL_GetSwapInterval) (_THIS);
|
||||
void (*GL_SwapWindow) (_THIS, SDL_Window * window);
|
||||
int (*GL_SwapWindow) (_THIS, SDL_Window * window);
|
||||
void (*GL_DeleteContext) (_THIS, SDL_GLContext context);
|
||||
void (*GL_DefaultProfileConfig) (_THIS, int *mask, int *major, int *minor);
|
||||
|
||||
/* * * */
|
||||
/*
|
||||
* Vulkan support
|
||||
*/
|
||||
int (*Vulkan_LoadLibrary) (_THIS, const char *path);
|
||||
void (*Vulkan_UnloadLibrary) (_THIS);
|
||||
SDL_bool (*Vulkan_GetInstanceExtensions) (_THIS, SDL_Window *window, unsigned *count, const char **names);
|
||||
SDL_bool (*Vulkan_CreateSurface) (_THIS, SDL_Window *window, VkInstance instance, VkSurfaceKHR *surface);
|
||||
void (*Vulkan_GetDrawableSize) (_THIS, SDL_Window * window, int *w, int *h);
|
||||
|
||||
/* * * */
|
||||
/*
|
||||
|
|
@ -288,6 +306,7 @@ struct SDL_VideoDevice
|
|||
|
||||
/* * * */
|
||||
/* Data common to all drivers */
|
||||
SDL_bool is_dummy;
|
||||
SDL_bool suspend_screensaver;
|
||||
int num_displays;
|
||||
SDL_VideoDisplay *displays;
|
||||
|
|
@ -295,7 +314,7 @@ struct SDL_VideoDevice
|
|||
SDL_Window *grabbed_window;
|
||||
Uint8 window_magic;
|
||||
Uint32 next_object_id;
|
||||
char * clipboard_text;
|
||||
char *clipboard_text;
|
||||
|
||||
/* * * */
|
||||
/* Data used by the GL drivers */
|
||||
|
|
@ -323,7 +342,9 @@ struct SDL_VideoDevice
|
|||
int profile_mask;
|
||||
int share_with_current_context;
|
||||
int release_behavior;
|
||||
int reset_notification;
|
||||
int framebuffer_srgb_capable;
|
||||
int no_error;
|
||||
int retained_backing;
|
||||
int driver_loaded;
|
||||
char driver_path[256];
|
||||
|
|
@ -340,6 +361,17 @@ struct SDL_VideoDevice
|
|||
SDL_TLSID current_glwin_tls;
|
||||
SDL_TLSID current_glctx_tls;
|
||||
|
||||
/* * * */
|
||||
/* Data used by the Vulkan drivers */
|
||||
struct
|
||||
{
|
||||
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
|
||||
PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;
|
||||
int loader_loaded;
|
||||
char loader_path[256];
|
||||
void *loader_handle;
|
||||
} vulkan_config;
|
||||
|
||||
/* * * */
|
||||
/* Data private to this driver */
|
||||
void *driverdata;
|
||||
|
|
@ -366,57 +398,26 @@ typedef struct VideoBootStrap
|
|||
SDL_VideoDevice *(*create) (int devindex);
|
||||
} VideoBootStrap;
|
||||
|
||||
#if SDL_VIDEO_DRIVER_COCOA
|
||||
/* Not all of these are available in a given build. Use #ifdefs, etc. */
|
||||
extern VideoBootStrap COCOA_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_X11
|
||||
extern VideoBootStrap X11_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_MIR
|
||||
extern VideoBootStrap MIR_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_DIRECTFB
|
||||
extern VideoBootStrap DirectFB_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_WINDOWS
|
||||
extern VideoBootStrap WINDOWS_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_WINRT
|
||||
extern VideoBootStrap WINRT_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_HAIKU
|
||||
extern VideoBootStrap HAIKU_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_PANDORA
|
||||
extern VideoBootStrap PND_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_UIKIT
|
||||
extern VideoBootStrap UIKIT_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_ANDROID
|
||||
extern VideoBootStrap Android_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_PSP
|
||||
extern VideoBootStrap PSP_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_RPI
|
||||
extern VideoBootStrap RPI_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_DUMMY
|
||||
extern VideoBootStrap KMSDRM_bootstrap;
|
||||
extern VideoBootStrap DUMMY_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_WAYLAND
|
||||
extern VideoBootStrap Wayland_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_NACL
|
||||
extern VideoBootStrap NACL_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_VIVANTE
|
||||
extern VideoBootStrap VIVANTE_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_EMSCRIPTEN
|
||||
extern VideoBootStrap Emscripten_bootstrap;
|
||||
#endif
|
||||
extern VideoBootStrap QNX_bootstrap;
|
||||
|
||||
extern SDL_VideoDevice *SDL_GetVideoDevice(void);
|
||||
extern int SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode);
|
||||
|
|
@ -425,7 +426,10 @@ extern SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayM
|
|||
extern SDL_VideoDisplay *SDL_GetDisplayForWindow(SDL_Window *window);
|
||||
extern void *SDL_GetDisplayDriverData( int displayIndex );
|
||||
|
||||
extern void SDL_GL_DeduceMaxSupportedESProfile(int* major, int* minor);
|
||||
|
||||
extern int SDL_RecreateWindow(SDL_Window * window, Uint32 flags);
|
||||
extern SDL_bool SDL_HasWindows(void);
|
||||
|
||||
extern void SDL_OnWindowShown(SDL_Window * window);
|
||||
extern void SDL_OnWindowHidden(SDL_Window * window);
|
||||
|
|
@ -443,6 +447,13 @@ extern SDL_bool SDL_ShouldAllowTopmost(void);
|
|||
|
||||
extern float SDL_ComputeDiagonalDPI(int hpix, int vpix, float hinches, float vinches);
|
||||
|
||||
#endif /* _SDL_sysvideo_h */
|
||||
extern void SDL_OnApplicationWillTerminate(void);
|
||||
extern void SDL_OnApplicationDidReceiveMemoryWarning(void);
|
||||
extern void SDL_OnApplicationWillResignActive(void);
|
||||
extern void SDL_OnApplicationDidEnterBackground(void);
|
||||
extern void SDL_OnApplicationWillEnterForeground(void);
|
||||
extern void SDL_OnApplicationDidBecomeActive(void);
|
||||
|
||||
#endif /* SDL_sysvideo_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -46,13 +46,10 @@
|
|||
#include "SDL_opengles2.h"
|
||||
#endif /* SDL_VIDEO_OPENGL_ES2 && !SDL_VIDEO_OPENGL */
|
||||
|
||||
#if !SDL_VIDEO_OPENGL
|
||||
#ifndef GL_CONTEXT_RELEASE_BEHAVIOR_KHR
|
||||
#define GL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x82FB
|
||||
#endif
|
||||
|
||||
/* On Windows, windows.h defines CreateWindow */
|
||||
#ifdef CreateWindow
|
||||
#undef CreateWindow
|
||||
#endif
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
|
|
@ -100,15 +97,21 @@ static VideoBootStrap *bootstrap[] = {
|
|||
#if SDL_VIDEO_DRIVER_PSP
|
||||
&PSP_bootstrap,
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_KMSDRM
|
||||
&KMSDRM_bootstrap,
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_RPI
|
||||
&RPI_bootstrap,
|
||||
#endif
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_NACL
|
||||
&NACL_bootstrap,
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_EMSCRIPTEN
|
||||
&Emscripten_bootstrap,
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_QNX
|
||||
&QNX_bootstrap,
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_DUMMY
|
||||
&DUMMY_bootstrap,
|
||||
#endif
|
||||
|
|
@ -122,6 +125,7 @@ static SDL_VideoDevice *_this = NULL;
|
|||
SDL_UninitializedVideo(); \
|
||||
return retval; \
|
||||
} \
|
||||
SDL_assert(window && window->magic == &_this->window_magic); \
|
||||
if (!window || window->magic != &_this->window_magic) { \
|
||||
SDL_SetError("Invalid window"); \
|
||||
return retval; \
|
||||
|
|
@ -133,6 +137,7 @@ static SDL_VideoDevice *_this = NULL;
|
|||
return retval; \
|
||||
} \
|
||||
SDL_assert(_this->displays != NULL); \
|
||||
SDL_assert(displayIndex >= 0 && displayIndex < _this->num_displays); \
|
||||
if (displayIndex < 0 || displayIndex >= _this->num_displays) { \
|
||||
SDL_SetError("displayIndex must be in the range 0 - %d", \
|
||||
_this->num_displays - 1); \
|
||||
|
|
@ -170,6 +175,11 @@ ShouldUseTextureFramebuffer()
|
|||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
/* If this is the dummy driver there is no texture support */
|
||||
if (_this->is_dummy) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
/* If the user has specified a software renderer we can't use a
|
||||
texture framebuffer, or renderer creation will go recursive.
|
||||
*/
|
||||
|
|
@ -195,7 +205,7 @@ ShouldUseTextureFramebuffer()
|
|||
return SDL_FALSE;
|
||||
|
||||
#elif defined(__MACOSX__)
|
||||
/* Mac OS X uses OpenGL as the native fast path */
|
||||
/* Mac OS X uses OpenGL as the native fast path (for cocoa and X11) */
|
||||
return SDL_TRUE;
|
||||
|
||||
#elif defined(__LINUX__)
|
||||
|
|
@ -336,9 +346,14 @@ SDL_CreateWindowTexture(SDL_VideoDevice *unused, SDL_Window * window, Uint32 * f
|
|||
/* Create framebuffer data */
|
||||
data->bytes_per_pixel = SDL_BYTESPERPIXEL(*format);
|
||||
data->pitch = (((window->w * data->bytes_per_pixel) + 3) & ~3);
|
||||
data->pixels = SDL_malloc(window->h * data->pitch);
|
||||
if (!data->pixels) {
|
||||
return SDL_OutOfMemory();
|
||||
|
||||
{
|
||||
/* Make static analysis happy about potential malloc(0) calls. */
|
||||
const size_t allocsize = window->h * data->pitch;
|
||||
data->pixels = SDL_malloc((allocsize > 0) ? allocsize : 1);
|
||||
if (!data->pixels) {
|
||||
return SDL_OutOfMemory();
|
||||
}
|
||||
}
|
||||
|
||||
*pixels = data->pixels;
|
||||
|
|
@ -707,21 +722,21 @@ int SDL_GetDisplayUsableBounds(int displayIndex, SDL_Rect * rect)
|
|||
int
|
||||
SDL_GetDisplayDPI(int displayIndex, float * ddpi, float * hdpi, float * vdpi)
|
||||
{
|
||||
SDL_VideoDisplay *display;
|
||||
SDL_VideoDisplay *display;
|
||||
|
||||
CHECK_DISPLAY_INDEX(displayIndex, -1);
|
||||
|
||||
display = &_this->displays[displayIndex];
|
||||
|
||||
if (_this->GetDisplayDPI) {
|
||||
if (_this->GetDisplayDPI(_this, display, ddpi, hdpi, vdpi) == 0) {
|
||||
return 0;
|
||||
}
|
||||
if (_this->GetDisplayDPI) {
|
||||
if (_this->GetDisplayDPI(_this, display, ddpi, hdpi, vdpi) == 0) {
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
return -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
SDL_bool
|
||||
|
|
@ -1157,35 +1172,38 @@ SDL_UpdateFullscreenMode(SDL_Window * window, SDL_bool fullscreen)
|
|||
CHECK_WINDOW_MAGIC(window,-1);
|
||||
|
||||
/* if we are in the process of hiding don't go back to fullscreen */
|
||||
if ( window->is_hiding && fullscreen )
|
||||
if (window->is_hiding && fullscreen) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef __MACOSX__
|
||||
/* if the window is going away and no resolution change is necessary,
|
||||
do nothing, or else we may trigger an ugly double-transition
|
||||
do nothing, or else we may trigger an ugly double-transition
|
||||
*/
|
||||
if (window->is_destroying && (window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP)
|
||||
return 0;
|
||||
if (SDL_strcmp(_this->name, "cocoa") == 0) { /* don't do this for X11, etc */
|
||||
if (window->is_destroying && (window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP)
|
||||
return 0;
|
||||
|
||||
/* If we're switching between a fullscreen Space and "normal" fullscreen, we need to get back to normal first. */
|
||||
if (fullscreen && ((window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP) && ((window->flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN)) {
|
||||
if (!Cocoa_SetWindowFullscreenSpace(window, SDL_FALSE)) {
|
||||
return -1;
|
||||
/* If we're switching between a fullscreen Space and "normal" fullscreen, we need to get back to normal first. */
|
||||
if (fullscreen && ((window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP) && ((window->flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN)) {
|
||||
if (!Cocoa_SetWindowFullscreenSpace(window, SDL_FALSE)) {
|
||||
return -1;
|
||||
}
|
||||
} else if (fullscreen && ((window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN) && ((window->flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP)) {
|
||||
display = SDL_GetDisplayForWindow(window);
|
||||
SDL_SetDisplayModeForDisplay(display, NULL);
|
||||
if (_this->SetWindowFullscreen) {
|
||||
_this->SetWindowFullscreen(_this, window, display, SDL_FALSE);
|
||||
}
|
||||
}
|
||||
} else if (fullscreen && ((window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN) && ((window->flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP)) {
|
||||
display = SDL_GetDisplayForWindow(window);
|
||||
SDL_SetDisplayModeForDisplay(display, NULL);
|
||||
if (_this->SetWindowFullscreen) {
|
||||
_this->SetWindowFullscreen(_this, window, display, SDL_FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
if (Cocoa_SetWindowFullscreenSpace(window, fullscreen)) {
|
||||
if (Cocoa_IsWindowInFullscreenSpace(window) != fullscreen) {
|
||||
return -1;
|
||||
if (Cocoa_SetWindowFullscreenSpace(window, fullscreen)) {
|
||||
if (Cocoa_IsWindowInFullscreenSpace(window) != fullscreen) {
|
||||
return -1;
|
||||
}
|
||||
window->last_fullscreen_flags = window->flags;
|
||||
return 0;
|
||||
}
|
||||
window->last_fullscreen_flags = window->flags;
|
||||
return 0;
|
||||
}
|
||||
#elif __WINRT__ && (NTDDI_VERSION < NTDDI_WIN10)
|
||||
/* HACK: WinRT 8.x apps can't choose whether or not they are fullscreen
|
||||
|
|
@ -1304,7 +1322,7 @@ SDL_UpdateFullscreenMode(SDL_Window * window, SDL_bool fullscreen)
|
|||
}
|
||||
|
||||
#define CREATE_FLAGS \
|
||||
(SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_ALWAYS_ON_TOP | SDL_WINDOW_SKIP_TASKBAR | SDL_WINDOW_POPUP_MENU | SDL_WINDOW_UTILITY | SDL_WINDOW_TOOLTIP)
|
||||
(SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_ALWAYS_ON_TOP | SDL_WINDOW_SKIP_TASKBAR | SDL_WINDOW_POPUP_MENU | SDL_WINDOW_UTILITY | SDL_WINDOW_TOOLTIP | SDL_WINDOW_VULKAN)
|
||||
|
||||
static void
|
||||
SDL_FinishWindowCreation(SDL_Window *window, Uint32 flags)
|
||||
|
|
@ -1338,7 +1356,7 @@ SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags)
|
|||
}
|
||||
}
|
||||
|
||||
if ( (((flags & SDL_WINDOW_UTILITY) != 0) + ((flags & SDL_WINDOW_TOOLTIP) != 0) + ((flags & SDL_WINDOW_POPUP_MENU) != 0)) > 1 ) {
|
||||
if ((((flags & SDL_WINDOW_UTILITY) != 0) + ((flags & SDL_WINDOW_TOOLTIP) != 0) + ((flags & SDL_WINDOW_POPUP_MENU) != 0)) > 1) {
|
||||
SDL_SetError("Conflicting window flags specified");
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -1359,7 +1377,7 @@ SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags)
|
|||
|
||||
/* Some platforms have OpenGL enabled by default */
|
||||
#if (SDL_VIDEO_OPENGL && __MACOSX__) || __IPHONEOS__ || __ANDROID__ || __NACL__
|
||||
if (SDL_strcmp(_this->name, "dummy") != 0) {
|
||||
if (!_this->is_dummy && !(flags & SDL_WINDOW_VULKAN)) {
|
||||
flags |= SDL_WINDOW_OPENGL;
|
||||
}
|
||||
#endif
|
||||
|
|
@ -1373,6 +1391,21 @@ SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags)
|
|||
}
|
||||
}
|
||||
|
||||
if (flags & SDL_WINDOW_VULKAN) {
|
||||
if (!_this->Vulkan_CreateSurface) {
|
||||
SDL_SetError("Vulkan support is either not configured in SDL "
|
||||
"or not available in video driver");
|
||||
return NULL;
|
||||
}
|
||||
if (flags & SDL_WINDOW_OPENGL) {
|
||||
SDL_SetError("Vulkan and OpenGL not supported on same window");
|
||||
return NULL;
|
||||
}
|
||||
if (SDL_Vulkan_LoadLibrary(NULL) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Unless the user has specified the high-DPI disabling hint, respect the
|
||||
* SDL_WINDOW_ALLOW_HIGHDPI flag.
|
||||
*/
|
||||
|
|
@ -1439,7 +1472,7 @@ SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags)
|
|||
}
|
||||
_this->windows = window;
|
||||
|
||||
if (_this->CreateWindow && _this->CreateWindow(_this, window) < 0) {
|
||||
if (_this->CreateSDLWindow && _this->CreateSDLWindow(_this, window) < 0) {
|
||||
SDL_DestroyWindow(window);
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -1476,7 +1509,7 @@ SDL_CreateWindowFrom(const void *data)
|
|||
SDL_UninitializedVideo();
|
||||
return NULL;
|
||||
}
|
||||
if (!_this->CreateWindowFrom) {
|
||||
if (!_this->CreateSDLWindowFrom) {
|
||||
SDL_Unsupported();
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -1498,7 +1531,7 @@ SDL_CreateWindowFrom(const void *data)
|
|||
}
|
||||
_this->windows = window;
|
||||
|
||||
if (_this->CreateWindowFrom(_this, window, data) < 0) {
|
||||
if (_this->CreateSDLWindowFrom(_this, window, data) < 0) {
|
||||
SDL_DestroyWindow(window);
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -1548,12 +1581,22 @@ SDL_RecreateWindow(SDL_Window * window, Uint32 flags)
|
|||
}
|
||||
}
|
||||
|
||||
if ((window->flags & SDL_WINDOW_VULKAN) != (flags & SDL_WINDOW_VULKAN)) {
|
||||
SDL_SetError("Can't change SDL_WINDOW_VULKAN window flag");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((window->flags & SDL_WINDOW_VULKAN) && (flags & SDL_WINDOW_OPENGL)) {
|
||||
SDL_SetError("Vulkan and OpenGL not supported on same window");
|
||||
return -1;
|
||||
}
|
||||
|
||||
window->flags = ((flags & CREATE_FLAGS) | SDL_WINDOW_HIDDEN);
|
||||
window->last_fullscreen_flags = window->flags;
|
||||
window->is_destroying = SDL_FALSE;
|
||||
|
||||
if (_this->CreateWindow && !(flags & SDL_WINDOW_FOREIGN)) {
|
||||
if (_this->CreateWindow(_this, window) < 0) {
|
||||
if (_this->CreateSDLWindow && !(flags & SDL_WINDOW_FOREIGN)) {
|
||||
if (_this->CreateSDLWindow(_this, window) < 0) {
|
||||
if (loaded_opengl) {
|
||||
SDL_GL_UnloadLibrary();
|
||||
window->flags &= ~SDL_WINDOW_OPENGL;
|
||||
|
|
@ -1583,6 +1626,12 @@ SDL_RecreateWindow(SDL_Window * window, Uint32 flags)
|
|||
return 0;
|
||||
}
|
||||
|
||||
SDL_bool
|
||||
SDL_HasWindows(void)
|
||||
{
|
||||
return (_this && _this->windows != NULL);
|
||||
}
|
||||
|
||||
Uint32
|
||||
SDL_GetWindowID(SDL_Window * window)
|
||||
{
|
||||
|
|
@ -1738,7 +1787,7 @@ SDL_SetWindowPosition(SDL_Window * window, int x, int y)
|
|||
if (SDL_WINDOWPOS_ISCENTERED(x) || SDL_WINDOWPOS_ISCENTERED(y)) {
|
||||
int displayIndex = (x & 0xFFFF);
|
||||
SDL_Rect bounds;
|
||||
if (displayIndex > _this->num_displays) {
|
||||
if (displayIndex >= _this->num_displays) {
|
||||
displayIndex = 0;
|
||||
}
|
||||
|
||||
|
|
@ -1867,20 +1916,16 @@ SDL_SetWindowSize(SDL_Window * window, int w, int h)
|
|||
}
|
||||
|
||||
/* Make sure we don't exceed any window size limits */
|
||||
if (window->min_w && w < window->min_w)
|
||||
{
|
||||
if (window->min_w && w < window->min_w) {
|
||||
w = window->min_w;
|
||||
}
|
||||
if (window->max_w && w > window->max_w)
|
||||
{
|
||||
if (window->max_w && w > window->max_w) {
|
||||
w = window->max_w;
|
||||
}
|
||||
if (window->min_h && h < window->min_h)
|
||||
{
|
||||
if (window->min_h && h < window->min_h) {
|
||||
h = window->min_h;
|
||||
}
|
||||
if (window->max_h && h > window->max_h)
|
||||
{
|
||||
if (window->max_h && h > window->max_h) {
|
||||
h = window->max_h;
|
||||
}
|
||||
|
||||
|
|
@ -1917,30 +1962,6 @@ SDL_GetWindowSize(SDL_Window * window, int *w, int *h)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
SDL_SetWindowMinimumSize(SDL_Window * window, int min_w, int min_h)
|
||||
{
|
||||
CHECK_WINDOW_MAGIC(window,);
|
||||
if (min_w <= 0) {
|
||||
SDL_InvalidParamError("min_w");
|
||||
return;
|
||||
}
|
||||
if (min_h <= 0) {
|
||||
SDL_InvalidParamError("min_h");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
|
||||
window->min_w = min_w;
|
||||
window->min_h = min_h;
|
||||
if (_this->SetWindowMinimumSize) {
|
||||
_this->SetWindowMinimumSize(_this, window);
|
||||
}
|
||||
/* Ensure that window is not smaller than minimal size */
|
||||
SDL_SetWindowSize(window, SDL_max(window->w, window->min_w), SDL_max(window->h, window->min_h));
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
SDL_GetWindowBordersSize(SDL_Window * window, int *top, int *left, int *bottom, int *right)
|
||||
{
|
||||
|
|
@ -1963,6 +1984,37 @@ SDL_GetWindowBordersSize(SDL_Window * window, int *top, int *left, int *bottom,
|
|||
return _this->GetWindowBordersSize(_this, window, top, left, bottom, right);
|
||||
}
|
||||
|
||||
void
|
||||
SDL_SetWindowMinimumSize(SDL_Window * window, int min_w, int min_h)
|
||||
{
|
||||
CHECK_WINDOW_MAGIC(window,);
|
||||
if (min_w <= 0) {
|
||||
SDL_InvalidParamError("min_w");
|
||||
return;
|
||||
}
|
||||
if (min_h <= 0) {
|
||||
SDL_InvalidParamError("min_h");
|
||||
return;
|
||||
}
|
||||
|
||||
if ((window->max_w && min_w >= window->max_w) ||
|
||||
(window->max_h && min_h >= window->max_h)) {
|
||||
SDL_SetError("SDL_SetWindowMinimumSize(): Tried to set minimum size larger than maximum size");
|
||||
return;
|
||||
}
|
||||
|
||||
window->min_w = min_w;
|
||||
window->min_h = min_h;
|
||||
|
||||
if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
|
||||
if (_this->SetWindowMinimumSize) {
|
||||
_this->SetWindowMinimumSize(_this, window);
|
||||
}
|
||||
/* Ensure that window is not smaller than minimal size */
|
||||
SDL_SetWindowSize(window, SDL_max(window->w, window->min_w), SDL_max(window->h, window->min_h));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
SDL_GetWindowMinimumSize(SDL_Window * window, int *min_w, int *min_h)
|
||||
{
|
||||
|
|
@ -1988,9 +2040,15 @@ SDL_SetWindowMaximumSize(SDL_Window * window, int max_w, int max_h)
|
|||
return;
|
||||
}
|
||||
|
||||
if (max_w <= window->min_w || max_h <= window->min_h) {
|
||||
SDL_SetError("SDL_SetWindowMaximumSize(): Tried to set maximum size smaller than minimum size");
|
||||
return;
|
||||
}
|
||||
|
||||
window->max_w = max_w;
|
||||
window->max_h = max_h;
|
||||
|
||||
if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
|
||||
window->max_w = max_w;
|
||||
window->max_h = max_h;
|
||||
if (_this->SetWindowMaximumSize) {
|
||||
_this->SetWindowMaximumSize(_this, window);
|
||||
}
|
||||
|
|
@ -2035,13 +2093,13 @@ SDL_HideWindow(SDL_Window * window)
|
|||
return;
|
||||
}
|
||||
|
||||
window->is_hiding = SDL_TRUE;
|
||||
window->is_hiding = SDL_TRUE;
|
||||
SDL_UpdateFullscreenMode(window, SDL_FALSE);
|
||||
|
||||
if (_this->HideWindow) {
|
||||
_this->HideWindow(_this, window);
|
||||
}
|
||||
window->is_hiding = SDL_FALSE;
|
||||
window->is_hiding = SDL_FALSE;
|
||||
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_HIDDEN, 0, 0);
|
||||
}
|
||||
|
||||
|
|
@ -2506,8 +2564,10 @@ ShouldMinimizeOnFocusLoss(SDL_Window * window)
|
|||
}
|
||||
|
||||
#ifdef __MACOSX__
|
||||
if (Cocoa_IsWindowInFullscreenSpace(window)) {
|
||||
return SDL_FALSE;
|
||||
if (SDL_strcmp(_this->name, "cocoa") == 0) { /* don't do this for X11, etc */
|
||||
if (Cocoa_IsWindowInFullscreenSpace(window)) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -2586,6 +2646,9 @@ SDL_DestroyWindow(SDL_Window * window)
|
|||
if (window->flags & SDL_WINDOW_OPENGL) {
|
||||
SDL_GL_UnloadLibrary();
|
||||
}
|
||||
if (window->flags & SDL_WINDOW_VULKAN) {
|
||||
SDL_Vulkan_UnloadLibrary();
|
||||
}
|
||||
|
||||
display = SDL_GetDisplayForWindow(window);
|
||||
if (display->fullscreen_window == window) {
|
||||
|
|
@ -2777,11 +2840,13 @@ SDL_GL_UnloadLibrary(void)
|
|||
}
|
||||
}
|
||||
|
||||
#if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
|
||||
static SDL_INLINE SDL_bool
|
||||
isAtLeastGL3(const char *verstr)
|
||||
{
|
||||
return (verstr && (SDL_atoi(verstr) >= 3));
|
||||
}
|
||||
#endif
|
||||
|
||||
SDL_bool
|
||||
SDL_GL_ExtensionSupported(const char *extension)
|
||||
|
|
@ -2855,7 +2920,7 @@ SDL_GL_ExtensionSupported(const char *extension)
|
|||
break;
|
||||
|
||||
terminator = where + SDL_strlen(extension);
|
||||
if (where == start || *(where - 1) == ' ')
|
||||
if (where == extensions || *(where - 1) == ' ')
|
||||
if (*terminator == ' ' || *terminator == '\0')
|
||||
return SDL_TRUE;
|
||||
|
||||
|
|
@ -2867,6 +2932,37 @@ SDL_GL_ExtensionSupported(const char *extension)
|
|||
#endif
|
||||
}
|
||||
|
||||
/* Deduce supported ES profile versions from the supported
|
||||
ARB_ES*_compatibility extensions. There is no direct query.
|
||||
|
||||
This is normally only called when the OpenGL driver supports
|
||||
{GLX,WGL}_EXT_create_context_es2_profile.
|
||||
*/
|
||||
void
|
||||
SDL_GL_DeduceMaxSupportedESProfile(int* major, int* minor)
|
||||
{
|
||||
/* THIS REQUIRES AN EXISTING GL CONTEXT THAT HAS BEEN MADE CURRENT. */
|
||||
/* Please refer to https://bugzilla.libsdl.org/show_bug.cgi?id=3725 for discussion. */
|
||||
#if SDL_VIDEO_OPENGL || SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
|
||||
/* XXX This is fragile; it will break in the event of release of
|
||||
* new versions of OpenGL ES.
|
||||
*/
|
||||
if (SDL_GL_ExtensionSupported("GL_ARB_ES3_2_compatibility")) {
|
||||
*major = 3;
|
||||
*minor = 2;
|
||||
} else if (SDL_GL_ExtensionSupported("GL_ARB_ES3_1_compatibility")) {
|
||||
*major = 3;
|
||||
*minor = 1;
|
||||
} else if (SDL_GL_ExtensionSupported("GL_ARB_ES3_compatibility")) {
|
||||
*major = 3;
|
||||
*minor = 0;
|
||||
} else {
|
||||
*major = 2;
|
||||
*minor = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
SDL_GL_ResetAttributes()
|
||||
{
|
||||
|
|
@ -2891,22 +2987,32 @@ SDL_GL_ResetAttributes()
|
|||
_this->gl_config.multisamplesamples = 0;
|
||||
_this->gl_config.retained_backing = 1;
|
||||
_this->gl_config.accelerated = -1; /* accelerated or not, both are fine */
|
||||
_this->gl_config.profile_mask = 0;
|
||||
|
||||
if (_this->GL_DefaultProfileConfig) {
|
||||
_this->GL_DefaultProfileConfig(_this, &_this->gl_config.profile_mask,
|
||||
&_this->gl_config.major_version,
|
||||
&_this->gl_config.minor_version);
|
||||
} else {
|
||||
#if SDL_VIDEO_OPENGL
|
||||
_this->gl_config.major_version = 2;
|
||||
_this->gl_config.minor_version = 1;
|
||||
_this->gl_config.major_version = 2;
|
||||
_this->gl_config.minor_version = 1;
|
||||
_this->gl_config.profile_mask = 0;
|
||||
#elif SDL_VIDEO_OPENGL_ES2
|
||||
_this->gl_config.major_version = 2;
|
||||
_this->gl_config.minor_version = 0;
|
||||
_this->gl_config.profile_mask = SDL_GL_CONTEXT_PROFILE_ES;
|
||||
_this->gl_config.major_version = 2;
|
||||
_this->gl_config.minor_version = 0;
|
||||
_this->gl_config.profile_mask = SDL_GL_CONTEXT_PROFILE_ES;
|
||||
#elif SDL_VIDEO_OPENGL_ES
|
||||
_this->gl_config.major_version = 1;
|
||||
_this->gl_config.minor_version = 1;
|
||||
_this->gl_config.profile_mask = SDL_GL_CONTEXT_PROFILE_ES;
|
||||
_this->gl_config.major_version = 1;
|
||||
_this->gl_config.minor_version = 1;
|
||||
_this->gl_config.profile_mask = SDL_GL_CONTEXT_PROFILE_ES;
|
||||
#endif
|
||||
}
|
||||
|
||||
_this->gl_config.flags = 0;
|
||||
_this->gl_config.framebuffer_srgb_capable = 0;
|
||||
_this->gl_config.no_error = 0;
|
||||
_this->gl_config.release_behavior = SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH;
|
||||
_this->gl_config.reset_notification = SDL_GL_CONTEXT_RESET_NO_NOTIFICATION;
|
||||
|
||||
_this->gl_config.share_with_current_context = 0;
|
||||
}
|
||||
|
|
@ -3016,6 +3122,12 @@ SDL_GL_SetAttribute(SDL_GLattr attr, int value)
|
|||
case SDL_GL_CONTEXT_RELEASE_BEHAVIOR:
|
||||
_this->gl_config.release_behavior = value;
|
||||
break;
|
||||
case SDL_GL_CONTEXT_RESET_NOTIFICATION:
|
||||
_this->gl_config.reset_notification = value;
|
||||
break;
|
||||
case SDL_GL_CONTEXT_NO_ERROR:
|
||||
_this->gl_config.no_error = value;
|
||||
break;
|
||||
default:
|
||||
retval = SDL_SetError("Unknown OpenGL attribute");
|
||||
break;
|
||||
|
|
@ -3047,9 +3159,17 @@ SDL_GL_GetAttribute(SDL_GLattr attr, int *value)
|
|||
GLenum attachmentattrib = 0;
|
||||
#endif
|
||||
|
||||
if (!value) {
|
||||
return SDL_InvalidParamError("value");
|
||||
}
|
||||
|
||||
/* Clear value in any case */
|
||||
*value = 0;
|
||||
|
||||
if (!_this) {
|
||||
return SDL_UninitializedVideo();
|
||||
}
|
||||
|
||||
switch (attr) {
|
||||
case SDL_GL_RED_SIZE:
|
||||
#if SDL_VIDEO_OPENGL
|
||||
|
|
@ -3212,6 +3332,11 @@ SDL_GL_GetAttribute(SDL_GLattr attr, int *value)
|
|||
*value = _this->gl_config.framebuffer_srgb_capable;
|
||||
return 0;
|
||||
}
|
||||
case SDL_GL_CONTEXT_NO_ERROR:
|
||||
{
|
||||
*value = _this->gl_config.no_error;
|
||||
return 0;
|
||||
}
|
||||
default:
|
||||
return SDL_SetError("Unknown OpenGL attribute");
|
||||
}
|
||||
|
|
@ -3219,7 +3344,7 @@ SDL_GL_GetAttribute(SDL_GLattr attr, int *value)
|
|||
#if SDL_VIDEO_OPENGL
|
||||
glGetStringFunc = SDL_GL_GetProcAddress("glGetString");
|
||||
if (!glGetStringFunc) {
|
||||
return SDL_SetError("Failed getting OpenGL glGetString entry point");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (attachmentattrib && isAtLeastGL3((const char *) glGetStringFunc(GL_VERSION))) {
|
||||
|
|
@ -3228,7 +3353,7 @@ SDL_GL_GetAttribute(SDL_GLattr attr, int *value)
|
|||
if (glGetFramebufferAttachmentParameterivFunc) {
|
||||
glGetFramebufferAttachmentParameterivFunc(GL_FRAMEBUFFER, attachment, attachmentattrib, (GLint *) value);
|
||||
} else {
|
||||
return SDL_SetError("Failed getting OpenGL glGetFramebufferAttachmentParameteriv entry point");
|
||||
return -1;
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
|
|
@ -3238,13 +3363,13 @@ SDL_GL_GetAttribute(SDL_GLattr attr, int *value)
|
|||
if (glGetIntegervFunc) {
|
||||
glGetIntegervFunc(attrib, (GLint *) value);
|
||||
} else {
|
||||
return SDL_SetError("Failed getting OpenGL glGetIntegerv entry point");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
glGetErrorFunc = SDL_GL_GetProcAddress("glGetError");
|
||||
if (!glGetErrorFunc) {
|
||||
return SDL_SetError("Failed getting OpenGL glGetError entry point");
|
||||
return -1;
|
||||
}
|
||||
|
||||
error = glGetErrorFunc();
|
||||
|
|
@ -3617,8 +3742,9 @@ SDL_IsScreenKeyboardShown(SDL_Window *window)
|
|||
#include "x11/SDL_x11messagebox.h"
|
||||
#endif
|
||||
|
||||
// This function will be unused if none of the above video drivers are present.
|
||||
SDL_UNUSED static SDL_bool SDL_MessageboxValidForDriver(const SDL_MessageBoxData *messageboxdata, SDL_SYSWM_TYPE drivertype)
|
||||
|
||||
#if SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_WINRT || SDL_VIDEO_DRIVER_COCOA || SDL_VIDEO_DRIVER_UIKIT || SDL_VIDEO_DRIVER_X11
|
||||
static SDL_bool SDL_MessageboxValidForDriver(const SDL_MessageBoxData *messageboxdata, SDL_SYSWM_TYPE drivertype)
|
||||
{
|
||||
SDL_SysWMinfo info;
|
||||
SDL_Window *window = messageboxdata->window;
|
||||
|
|
@ -3634,6 +3760,7 @@ SDL_UNUSED static SDL_bool SDL_MessageboxValidForDriver(const SDL_MessageBoxData
|
|||
return (info.subsystem == drivertype);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
int
|
||||
SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
|
||||
|
|
@ -3780,15 +3907,171 @@ SDL_SetWindowHitTest(SDL_Window * window, SDL_HitTest callback, void *userdata)
|
|||
return 0;
|
||||
}
|
||||
|
||||
float SDL_ComputeDiagonalDPI(int hpix, int vpix, float hinches, float vinches)
|
||||
float
|
||||
SDL_ComputeDiagonalDPI(int hpix, int vpix, float hinches, float vinches)
|
||||
{
|
||||
float den2 = hinches * hinches + vinches * vinches;
|
||||
if ( den2 <= 0.0f ) {
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
return (float)(SDL_sqrt((double)hpix * (double)hpix + (double)vpix * (double)vpix) /
|
||||
SDL_sqrt((double)den2));
|
||||
float den2 = hinches * hinches + vinches * vinches;
|
||||
if (den2 <= 0.0f) {
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
return (float)(SDL_sqrt((double)hpix * (double)hpix + (double)vpix * (double)vpix) /
|
||||
SDL_sqrt((double)den2));
|
||||
}
|
||||
|
||||
/*
|
||||
* Functions used by iOS application delegates
|
||||
*/
|
||||
void SDL_OnApplicationWillTerminate(void)
|
||||
{
|
||||
SDL_SendAppEvent(SDL_APP_TERMINATING);
|
||||
}
|
||||
|
||||
void SDL_OnApplicationDidReceiveMemoryWarning(void)
|
||||
{
|
||||
SDL_SendAppEvent(SDL_APP_LOWMEMORY);
|
||||
}
|
||||
|
||||
void SDL_OnApplicationWillResignActive(void)
|
||||
{
|
||||
if (_this) {
|
||||
SDL_Window *window;
|
||||
for (window = _this->windows; window != NULL; window = window->next) {
|
||||
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_FOCUS_LOST, 0, 0);
|
||||
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_MINIMIZED, 0, 0);
|
||||
}
|
||||
}
|
||||
SDL_SendAppEvent(SDL_APP_WILLENTERBACKGROUND);
|
||||
}
|
||||
|
||||
void SDL_OnApplicationDidEnterBackground(void)
|
||||
{
|
||||
SDL_SendAppEvent(SDL_APP_DIDENTERBACKGROUND);
|
||||
}
|
||||
|
||||
void SDL_OnApplicationWillEnterForeground(void)
|
||||
{
|
||||
SDL_SendAppEvent(SDL_APP_WILLENTERFOREGROUND);
|
||||
}
|
||||
|
||||
void SDL_OnApplicationDidBecomeActive(void)
|
||||
{
|
||||
SDL_SendAppEvent(SDL_APP_DIDENTERFOREGROUND);
|
||||
|
||||
if (_this) {
|
||||
SDL_Window *window;
|
||||
for (window = _this->windows; window != NULL; window = window->next) {
|
||||
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_FOCUS_GAINED, 0, 0);
|
||||
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESTORED, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define NOT_A_VULKAN_WINDOW "The specified window isn't a Vulkan window"
|
||||
|
||||
int SDL_Vulkan_LoadLibrary(const char *path)
|
||||
{
|
||||
int retval;
|
||||
if (!_this) {
|
||||
SDL_UninitializedVideo();
|
||||
return -1;
|
||||
}
|
||||
if (_this->vulkan_config.loader_loaded) {
|
||||
if (path && SDL_strcmp(path, _this->vulkan_config.loader_path) != 0) {
|
||||
return SDL_SetError("Vulkan loader library already loaded");
|
||||
}
|
||||
retval = 0;
|
||||
} else {
|
||||
if (!_this->Vulkan_LoadLibrary) {
|
||||
return SDL_SetError("No Vulkan support in video driver");
|
||||
}
|
||||
retval = _this->Vulkan_LoadLibrary(_this, path);
|
||||
}
|
||||
if (retval == 0) {
|
||||
_this->vulkan_config.loader_loaded++;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
void *SDL_Vulkan_GetVkGetInstanceProcAddr(void)
|
||||
{
|
||||
if (!_this) {
|
||||
SDL_UninitializedVideo();
|
||||
return NULL;
|
||||
}
|
||||
if (!_this->vulkan_config.loader_loaded) {
|
||||
SDL_SetError("No Vulkan loader has been loaded");
|
||||
return NULL;
|
||||
}
|
||||
return _this->vulkan_config.vkGetInstanceProcAddr;
|
||||
}
|
||||
|
||||
void SDL_Vulkan_UnloadLibrary(void)
|
||||
{
|
||||
if (!_this) {
|
||||
SDL_UninitializedVideo();
|
||||
return;
|
||||
}
|
||||
if (_this->vulkan_config.loader_loaded > 0) {
|
||||
if (--_this->vulkan_config.loader_loaded > 0) {
|
||||
return;
|
||||
}
|
||||
if (_this->Vulkan_UnloadLibrary) {
|
||||
_this->Vulkan_UnloadLibrary(_this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SDL_bool SDL_Vulkan_GetInstanceExtensions(SDL_Window *window, unsigned *count, const char **names)
|
||||
{
|
||||
CHECK_WINDOW_MAGIC(window, SDL_FALSE);
|
||||
|
||||
if (!(window->flags & SDL_WINDOW_VULKAN)) {
|
||||
SDL_SetError(NOT_A_VULKAN_WINDOW);
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (!count) {
|
||||
SDL_InvalidParamError("count");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
return _this->Vulkan_GetInstanceExtensions(_this, window, count, names);
|
||||
}
|
||||
|
||||
SDL_bool SDL_Vulkan_CreateSurface(SDL_Window *window,
|
||||
VkInstance instance,
|
||||
VkSurfaceKHR *surface)
|
||||
{
|
||||
CHECK_WINDOW_MAGIC(window, SDL_FALSE);
|
||||
|
||||
if (!(window->flags & SDL_WINDOW_VULKAN)) {
|
||||
SDL_SetError(NOT_A_VULKAN_WINDOW);
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (!instance) {
|
||||
SDL_InvalidParamError("instance");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (!surface) {
|
||||
SDL_InvalidParamError("surface");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
return _this->Vulkan_CreateSurface(_this, window, instance, surface);
|
||||
}
|
||||
|
||||
void SDL_Vulkan_GetDrawableSize(SDL_Window * window, int *w, int *h)
|
||||
{
|
||||
CHECK_WINDOW_MAGIC(window,);
|
||||
|
||||
if (_this->Vulkan_GetDrawableSize) {
|
||||
_this->Vulkan_GetDrawableSize(_this, window, w, h);
|
||||
} else {
|
||||
SDL_GetWindowSize(window, w, h);
|
||||
}
|
||||
}
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
91
Engine/lib/sdl/src/video/SDL_vulkan_internal.h
Normal file
91
Engine/lib/sdl/src/video/SDL_vulkan_internal.h
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#ifndef SDL_vulkan_internal_h_
|
||||
#define SDL_vulkan_internal_h_
|
||||
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#include "SDL_stdinc.h"
|
||||
|
||||
#if defined(SDL_LOADSO_DISABLED)
|
||||
#undef SDL_VIDEO_VULKAN
|
||||
#define SDL_VIDEO_VULKAN 0
|
||||
#endif
|
||||
|
||||
#if SDL_VIDEO_VULKAN
|
||||
|
||||
#if SDL_VIDEO_DRIVER_ANDROID
|
||||
#define VK_USE_PLATFORM_ANDROID_KHR
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_COCOA
|
||||
#define VK_USE_PLATFORM_MACOS_MVK
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_MIR
|
||||
#define VK_USE_PLATFORM_MIR_KHR
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_UIKIT
|
||||
#define VK_USE_PLATFORM_IOS_MVK
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_WAYLAND
|
||||
#define VK_USE_PLATFORM_WAYLAND_KHR
|
||||
#include "wayland/SDL_waylanddyn.h"
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_WINDOWS
|
||||
#define VK_USE_PLATFORM_WIN32_KHR
|
||||
#include "../core/windows/SDL_windows.h"
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_X11
|
||||
#define VK_USE_PLATFORM_XLIB_KHR
|
||||
#define VK_USE_PLATFORM_XCB_KHR
|
||||
#endif
|
||||
|
||||
#define VK_NO_PROTOTYPES
|
||||
#include "./khronos/vulkan/vulkan.h"
|
||||
|
||||
#include "SDL_vulkan.h"
|
||||
|
||||
|
||||
extern const char *SDL_Vulkan_GetResultString(VkResult result);
|
||||
|
||||
extern VkExtensionProperties *SDL_Vulkan_CreateInstanceExtensionsList(
|
||||
PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties,
|
||||
Uint32 *extensionCount); /* free returned list with SDL_free */
|
||||
|
||||
/* Implements functionality of SDL_Vulkan_GetInstanceExtensions for a list of
|
||||
* names passed in nameCount and names. */
|
||||
extern SDL_bool SDL_Vulkan_GetInstanceExtensions_Helper(unsigned *userCount,
|
||||
const char **userNames,
|
||||
unsigned nameCount,
|
||||
const char *const *names);
|
||||
|
||||
#else
|
||||
|
||||
/* No SDL Vulkan support, just include the header for typedefs */
|
||||
#include "SDL_vulkan.h"
|
||||
|
||||
typedef void (*PFN_vkGetInstanceProcAddr) (void);
|
||||
typedef int (*PFN_vkEnumerateInstanceExtensionProperties) (void);
|
||||
|
||||
#endif /* SDL_VIDEO_VULKAN */
|
||||
|
||||
#endif /* SDL_vulkan_internal_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
172
Engine/lib/sdl/src/video/SDL_vulkan_utils.c
Normal file
172
Engine/lib/sdl/src/video/SDL_vulkan_utils.c
Normal file
|
|
@ -0,0 +1,172 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#include "SDL_vulkan_internal.h"
|
||||
#include "SDL_error.h"
|
||||
|
||||
#if SDL_VIDEO_VULKAN
|
||||
|
||||
const char *SDL_Vulkan_GetResultString(VkResult result)
|
||||
{
|
||||
switch((int)result)
|
||||
{
|
||||
case VK_SUCCESS:
|
||||
return "VK_SUCCESS";
|
||||
case VK_NOT_READY:
|
||||
return "VK_NOT_READY";
|
||||
case VK_TIMEOUT:
|
||||
return "VK_TIMEOUT";
|
||||
case VK_EVENT_SET:
|
||||
return "VK_EVENT_SET";
|
||||
case VK_EVENT_RESET:
|
||||
return "VK_EVENT_RESET";
|
||||
case VK_INCOMPLETE:
|
||||
return "VK_INCOMPLETE";
|
||||
case VK_ERROR_OUT_OF_HOST_MEMORY:
|
||||
return "VK_ERROR_OUT_OF_HOST_MEMORY";
|
||||
case VK_ERROR_OUT_OF_DEVICE_MEMORY:
|
||||
return "VK_ERROR_OUT_OF_DEVICE_MEMORY";
|
||||
case VK_ERROR_INITIALIZATION_FAILED:
|
||||
return "VK_ERROR_INITIALIZATION_FAILED";
|
||||
case VK_ERROR_DEVICE_LOST:
|
||||
return "VK_ERROR_DEVICE_LOST";
|
||||
case VK_ERROR_MEMORY_MAP_FAILED:
|
||||
return "VK_ERROR_MEMORY_MAP_FAILED";
|
||||
case VK_ERROR_LAYER_NOT_PRESENT:
|
||||
return "VK_ERROR_LAYER_NOT_PRESENT";
|
||||
case VK_ERROR_EXTENSION_NOT_PRESENT:
|
||||
return "VK_ERROR_EXTENSION_NOT_PRESENT";
|
||||
case VK_ERROR_FEATURE_NOT_PRESENT:
|
||||
return "VK_ERROR_FEATURE_NOT_PRESENT";
|
||||
case VK_ERROR_INCOMPATIBLE_DRIVER:
|
||||
return "VK_ERROR_INCOMPATIBLE_DRIVER";
|
||||
case VK_ERROR_TOO_MANY_OBJECTS:
|
||||
return "VK_ERROR_TOO_MANY_OBJECTS";
|
||||
case VK_ERROR_FORMAT_NOT_SUPPORTED:
|
||||
return "VK_ERROR_FORMAT_NOT_SUPPORTED";
|
||||
case VK_ERROR_FRAGMENTED_POOL:
|
||||
return "VK_ERROR_FRAGMENTED_POOL";
|
||||
case VK_ERROR_SURFACE_LOST_KHR:
|
||||
return "VK_ERROR_SURFACE_LOST_KHR";
|
||||
case VK_ERROR_NATIVE_WINDOW_IN_USE_KHR:
|
||||
return "VK_ERROR_NATIVE_WINDOW_IN_USE_KHR";
|
||||
case VK_SUBOPTIMAL_KHR:
|
||||
return "VK_SUBOPTIMAL_KHR";
|
||||
case VK_ERROR_OUT_OF_DATE_KHR:
|
||||
return "VK_ERROR_OUT_OF_DATE_KHR";
|
||||
case VK_ERROR_INCOMPATIBLE_DISPLAY_KHR:
|
||||
return "VK_ERROR_INCOMPATIBLE_DISPLAY_KHR";
|
||||
case VK_ERROR_VALIDATION_FAILED_EXT:
|
||||
return "VK_ERROR_VALIDATION_FAILED_EXT";
|
||||
case VK_ERROR_OUT_OF_POOL_MEMORY_KHR:
|
||||
return "VK_ERROR_OUT_OF_POOL_MEMORY_KHR";
|
||||
case VK_ERROR_INVALID_SHADER_NV:
|
||||
return "VK_ERROR_INVALID_SHADER_NV";
|
||||
case VK_RESULT_MAX_ENUM:
|
||||
case VK_RESULT_RANGE_SIZE:
|
||||
break;
|
||||
}
|
||||
if(result < 0)
|
||||
return "VK_ERROR_<Unknown>";
|
||||
return "VK_<Unknown>";
|
||||
}
|
||||
|
||||
VkExtensionProperties *SDL_Vulkan_CreateInstanceExtensionsList(
|
||||
PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties,
|
||||
Uint32 *extensionCount)
|
||||
{
|
||||
Uint32 count = 0;
|
||||
VkResult result = vkEnumerateInstanceExtensionProperties(NULL, &count, NULL);
|
||||
VkExtensionProperties *retval;
|
||||
if(result == VK_ERROR_INCOMPATIBLE_DRIVER)
|
||||
{
|
||||
/* Avoid the ERR_MAX_STRLEN limit by passing part of the message
|
||||
* as a string argument.
|
||||
*/
|
||||
SDL_SetError(
|
||||
"You probably don't have a working Vulkan driver installed. %s %s %s(%d)",
|
||||
"Getting Vulkan extensions failed:",
|
||||
"vkEnumerateInstanceExtensionProperties returned",
|
||||
SDL_Vulkan_GetResultString(result),
|
||||
(int)result);
|
||||
return NULL;
|
||||
}
|
||||
else if(result != VK_SUCCESS)
|
||||
{
|
||||
SDL_SetError(
|
||||
"Getting Vulkan extensions failed: vkEnumerateInstanceExtensionProperties returned "
|
||||
"%s(%d)",
|
||||
SDL_Vulkan_GetResultString(result),
|
||||
(int)result);
|
||||
return NULL;
|
||||
}
|
||||
if(count == 0)
|
||||
{
|
||||
retval = SDL_calloc(1, sizeof(VkExtensionProperties)); // so we can return non-null
|
||||
}
|
||||
else
|
||||
{
|
||||
retval = SDL_calloc(count, sizeof(VkExtensionProperties));
|
||||
}
|
||||
if(!retval)
|
||||
{
|
||||
SDL_OutOfMemory();
|
||||
return NULL;
|
||||
}
|
||||
result = vkEnumerateInstanceExtensionProperties(NULL, &count, retval);
|
||||
if(result != VK_SUCCESS)
|
||||
{
|
||||
SDL_SetError(
|
||||
"Getting Vulkan extensions failed: vkEnumerateInstanceExtensionProperties returned "
|
||||
"%s(%d)",
|
||||
SDL_Vulkan_GetResultString(result),
|
||||
(int)result);
|
||||
SDL_free(retval);
|
||||
return NULL;
|
||||
}
|
||||
*extensionCount = count;
|
||||
return retval;
|
||||
}
|
||||
|
||||
SDL_bool SDL_Vulkan_GetInstanceExtensions_Helper(unsigned *userCount,
|
||||
const char **userNames,
|
||||
unsigned nameCount,
|
||||
const char *const *names)
|
||||
{
|
||||
if (userNames) {
|
||||
unsigned i;
|
||||
|
||||
if (*userCount < nameCount) {
|
||||
SDL_SetError("Output array for SDL_Vulkan_GetInstanceExtensions needs to be at least %d big", nameCount);
|
||||
return SDL_FALSE;
|
||||
}
|
||||
for (i = 0; i < nameCount; i++) {
|
||||
userNames[i] = names[i];
|
||||
}
|
||||
}
|
||||
*userCount = nameCount;
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
1834
Engine/lib/sdl/src/video/SDL_yuv.c
Normal file
1834
Engine/lib/sdl/src/video/SDL_yuv.c
Normal file
File diff suppressed because it is too large
Load diff
30
Engine/lib/sdl/src/video/SDL_yuv_c.h
Normal file
30
Engine/lib/sdl/src/video/SDL_yuv_c.h
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
|
||||
/* YUV conversion functions */
|
||||
|
||||
extern int SDL_ConvertPixels_YUV_to_RGB(int width, int height, Uint32 src_format, const void *src, int src_pitch, Uint32 dst_format, void *dst, int dst_pitch);
|
||||
extern int SDL_ConvertPixels_RGB_to_YUV(int width, int height, Uint32 src_format, const void *src, int src_pitch, Uint32 dst_format, void *dst, int dst_pitch);
|
||||
extern int SDL_ConvertPixels_YUV_to_YUV(int width, int height, Uint32 src_format, const void *src, int src_pitch, Uint32 dst_format, void *dst, int dst_pitch);
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -23,7 +23,7 @@
|
|||
#if SDL_VIDEO_DRIVER_ANDROID
|
||||
|
||||
#include "SDL_androidvideo.h"
|
||||
|
||||
#include "SDL_androidclipboard.h"
|
||||
#include "../../core/android/SDL_android.h"
|
||||
|
||||
int
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -20,13 +20,13 @@
|
|||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_androidclipboard_h
|
||||
#define _SDL_androidclipboard_h
|
||||
#ifndef SDL_androidclipboard_h_
|
||||
#define SDL_androidclipboard_h_
|
||||
|
||||
extern int Android_SetClipboardText(_THIS, const char *text);
|
||||
extern char *Android_GetClipboardText(_THIS);
|
||||
extern SDL_bool Android_HasClipboardText(_THIS);
|
||||
|
||||
#endif /* _SDL_androidclipboard_h */
|
||||
#endif /* SDL_androidclipboard_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -29,19 +29,17 @@
|
|||
#include "SDL_events.h"
|
||||
#include "SDL_androidwindow.h"
|
||||
|
||||
|
||||
void android_egl_context_backup();
|
||||
void android_egl_context_restore();
|
||||
|
||||
#if SDL_AUDIO_DRIVER_ANDROID
|
||||
void ANDROIDAUDIO_ResumeDevices(void);
|
||||
void ANDROIDAUDIO_PauseDevices(void);
|
||||
#if !SDL_AUDIO_DISABLED
|
||||
/* Can't include sysaudio "../../audio/android/SDL_androidaudio.h"
|
||||
* because of THIS redefinition */
|
||||
extern void ANDROIDAUDIO_ResumeDevices(void);
|
||||
extern void ANDROIDAUDIO_PauseDevices(void);
|
||||
#else
|
||||
static void ANDROIDAUDIO_ResumeDevices(void) {}
|
||||
static void ANDROIDAUDIO_PauseDevices(void) {}
|
||||
#endif
|
||||
|
||||
void
|
||||
static void
|
||||
android_egl_context_restore()
|
||||
{
|
||||
SDL_Event event;
|
||||
|
|
@ -55,7 +53,7 @@ android_egl_context_restore()
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
android_egl_context_backup()
|
||||
{
|
||||
/* Keep a copy of the EGL Context so we can try to restore it when we resume */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -29,6 +29,7 @@
|
|||
#include "SDL_androidwindow.h"
|
||||
|
||||
#include "SDL_androidvideo.h"
|
||||
#include "SDL_androidgl.h"
|
||||
#include "../../core/android/SDL_android.h"
|
||||
|
||||
#include <android/log.h>
|
||||
|
|
@ -38,7 +39,7 @@
|
|||
SDL_EGL_CreateContext_impl(Android)
|
||||
SDL_EGL_MakeCurrent_impl(Android)
|
||||
|
||||
void
|
||||
int
|
||||
Android_GLES_SwapWindow(_THIS, SDL_Window * window)
|
||||
{
|
||||
/* The following two calls existed in the original Java code
|
||||
|
|
@ -48,12 +49,12 @@ Android_GLES_SwapWindow(_THIS, SDL_Window * window)
|
|||
|
||||
/*_this->egl_data->eglWaitNative(EGL_CORE_NATIVE_ENGINE);
|
||||
_this->egl_data->eglWaitGL();*/
|
||||
SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);
|
||||
return SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);
|
||||
}
|
||||
|
||||
int
|
||||
Android_GLES_LoadLibrary(_THIS, const char *path) {
|
||||
return SDL_EGL_LoadLibrary(_this, path, (NativeDisplayType) 0);
|
||||
return SDL_EGL_LoadLibrary(_this, path, (NativeDisplayType) 0, 0);
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_ANDROID */
|
||||
|
|
|
|||
34
Engine/lib/sdl/src/video/android/SDL_androidgl.h
Normal file
34
Engine/lib/sdl/src/video/android/SDL_androidgl.h
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef SDL_androidgl_h_
|
||||
#define SDL_androidgl_h_
|
||||
|
||||
SDL_GLContext Android_GLES_CreateContext(_THIS, SDL_Window * window);
|
||||
int Android_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context);
|
||||
int Android_GLES_SwapWindow(_THIS, SDL_Window * window);
|
||||
int Android_GLES_LoadLibrary(_THIS, const char *path);
|
||||
|
||||
|
||||
#endif /* SDL_androidgl_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -129,8 +129,8 @@ static SDL_Scancode Android_Keycodes[] = {
|
|||
SDL_SCANCODE_AUDIOSTOP, /* AKEYCODE_MEDIA_STOP */
|
||||
SDL_SCANCODE_AUDIONEXT, /* AKEYCODE_MEDIA_NEXT */
|
||||
SDL_SCANCODE_AUDIOPREV, /* AKEYCODE_MEDIA_PREVIOUS */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_REWIND */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_FAST_FORWARD */
|
||||
SDL_SCANCODE_AUDIOREWIND, /* AKEYCODE_MEDIA_REWIND */
|
||||
SDL_SCANCODE_AUDIOFASTFORWARD, /* AKEYCODE_MEDIA_FAST_FORWARD */
|
||||
SDL_SCANCODE_MUTE, /* AKEYCODE_MUTE */
|
||||
SDL_SCANCODE_PAGEUP, /* AKEYCODE_PAGE_UP */
|
||||
SDL_SCANCODE_PAGEDOWN, /* AKEYCODE_PAGE_DOWN */
|
||||
|
|
@ -357,7 +357,7 @@ Android_HasScreenKeyboardSupport(_THIS)
|
|||
SDL_bool
|
||||
Android_IsScreenKeyboardShown(_THIS, SDL_Window * window)
|
||||
{
|
||||
return SDL_IsTextInputActive();
|
||||
return Android_JNI_IsScreenKeyboardShown();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -23,12 +23,12 @@
|
|||
#if SDL_VIDEO_DRIVER_ANDROID
|
||||
|
||||
#include "SDL_messagebox.h"
|
||||
#include "SDL_androidmessagebox.h"
|
||||
#include "../../core/android/SDL_android.h"
|
||||
|
||||
int
|
||||
Android_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
|
||||
{
|
||||
int Android_JNI_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid);
|
||||
|
||||
return Android_JNI_ShowMessageBox(messageboxdata, buttonid);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -30,6 +30,7 @@
|
|||
|
||||
#include "../../core/android/SDL_android.h"
|
||||
|
||||
/* See Android's MotionEvent class for constants */
|
||||
#define ACTION_DOWN 0
|
||||
#define ACTION_UP 1
|
||||
#define ACTION_MOVE 2
|
||||
|
|
@ -41,41 +42,59 @@
|
|||
#define BUTTON_BACK 8
|
||||
#define BUTTON_FORWARD 16
|
||||
|
||||
static Uint8 SDLButton;
|
||||
/* Last known Android mouse button state (includes all buttons) */
|
||||
static int last_state;
|
||||
|
||||
void
|
||||
Android_InitMouse(void)
|
||||
{
|
||||
SDLButton = 0;
|
||||
last_state = 0;
|
||||
}
|
||||
|
||||
void Android_OnMouse( int androidButton, int action, float x, float y) {
|
||||
/* Translate Android mouse button state to SDL mouse button */
|
||||
static Uint8
|
||||
TranslateButton(int state)
|
||||
{
|
||||
if (state & BUTTON_PRIMARY) {
|
||||
return SDL_BUTTON_LEFT;
|
||||
} else if (state & BUTTON_SECONDARY) {
|
||||
return SDL_BUTTON_RIGHT;
|
||||
} else if (state & BUTTON_TERTIARY) {
|
||||
return SDL_BUTTON_MIDDLE;
|
||||
} else if (state & BUTTON_FORWARD) {
|
||||
return SDL_BUTTON_X1;
|
||||
} else if (state & BUTTON_BACK) {
|
||||
return SDL_BUTTON_X2;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Android_OnMouse(int state, int action, float x, float y)
|
||||
{
|
||||
int changes;
|
||||
Uint8 button;
|
||||
|
||||
if (!Android_Window) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch(action) {
|
||||
case ACTION_DOWN:
|
||||
// Determine which button originated the event, and store it for ACTION_UP
|
||||
SDLButton = SDL_BUTTON_LEFT;
|
||||
if (androidButton == BUTTON_SECONDARY) {
|
||||
SDLButton = SDL_BUTTON_RIGHT;
|
||||
} else if (androidButton == BUTTON_TERTIARY) {
|
||||
SDLButton = SDL_BUTTON_MIDDLE;
|
||||
} else if (androidButton == BUTTON_FORWARD) {
|
||||
SDLButton = SDL_BUTTON_X1;
|
||||
} else if (androidButton == BUTTON_BACK) {
|
||||
SDLButton = SDL_BUTTON_X2;
|
||||
}
|
||||
changes = state & ~last_state;
|
||||
button = TranslateButton(changes);
|
||||
last_state = state;
|
||||
SDL_SendMouseMotion(Android_Window, 0, 0, x, y);
|
||||
SDL_SendMouseButton(Android_Window, 0, SDL_PRESSED, SDLButton);
|
||||
SDL_SendMouseButton(Android_Window, 0, SDL_PRESSED, button);
|
||||
break;
|
||||
|
||||
case ACTION_UP:
|
||||
// Android won't give us the button that originated the ACTION_DOWN event, so we'll
|
||||
// assume it's the one we stored
|
||||
changes = last_state & ~state;
|
||||
button = TranslateButton(changes);
|
||||
last_state = state;
|
||||
SDL_SendMouseMotion(Android_Window, 0, 0, x, y);
|
||||
SDL_SendMouseButton(Android_Window, 0, SDL_RELEASED, SDLButton);
|
||||
SDL_SendMouseButton(Android_Window, 0, SDL_RELEASED, button);
|
||||
break;
|
||||
|
||||
case ACTION_MOVE:
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -19,14 +19,14 @@
|
|||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef _SDL_androidmouse_h
|
||||
#define _SDL_androidmouse_h
|
||||
#ifndef SDL_androidmouse_h_
|
||||
#define SDL_androidmouse_h_
|
||||
|
||||
#include "SDL_androidvideo.h"
|
||||
|
||||
extern void Android_InitMouse(void);
|
||||
extern void Android_OnMouse( int button, int action, float x, float y);
|
||||
|
||||
#endif /* _SDL_androidmouse_h */
|
||||
#endif /* SDL_androidmouse_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -52,16 +52,13 @@ static void Android_GetWindowCoordinates(float x, float y,
|
|||
|
||||
static SDL_bool separate_mouse_and_touch = SDL_FALSE;
|
||||
|
||||
static void
|
||||
static void SDLCALL
|
||||
SeparateEventsHintWatcher(void *userdata, const char *name,
|
||||
const char *oldValue, const char *newValue)
|
||||
{
|
||||
jclass mActivityClass = Android_JNI_GetActivityClass();
|
||||
JNIEnv *env = Android_JNI_GetEnv();
|
||||
jfieldID fid = (*env)->GetStaticFieldID(env, mActivityClass, "mSeparateMouseAndTouch", "Z");
|
||||
|
||||
separate_mouse_and_touch = (newValue && (SDL_strcmp(newValue, "1") == 0));
|
||||
(*env)->SetStaticBooleanField(env, mActivityClass, fid, separate_mouse_and_touch ? JNI_TRUE : JNI_FALSE);
|
||||
|
||||
Android_JNI_SetSeparateMouseAndTouch(separate_mouse_and_touch);
|
||||
}
|
||||
|
||||
void Android_InitTouch(void)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -33,25 +33,23 @@
|
|||
#include "../../events/SDL_windowevents_c.h"
|
||||
|
||||
#include "SDL_androidvideo.h"
|
||||
#include "SDL_androidgl.h"
|
||||
#include "SDL_androidclipboard.h"
|
||||
#include "SDL_androidevents.h"
|
||||
#include "SDL_androidkeyboard.h"
|
||||
#include "SDL_androidmouse.h"
|
||||
#include "SDL_androidtouch.h"
|
||||
#include "SDL_androidwindow.h"
|
||||
#include "SDL_androidvulkan.h"
|
||||
|
||||
#define ANDROID_VID_DRIVER_NAME "Android"
|
||||
|
||||
/* Initialization/Query functions */
|
||||
static int Android_VideoInit(_THIS);
|
||||
static void Android_VideoQuit(_THIS);
|
||||
int Android_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi, float * hdpi, float * vdpi);
|
||||
|
||||
#include "../SDL_egl_c.h"
|
||||
/* GL functions (SDL_androidgl.c) */
|
||||
extern SDL_GLContext Android_GLES_CreateContext(_THIS, SDL_Window * window);
|
||||
extern int Android_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context);
|
||||
extern void Android_GLES_SwapWindow(_THIS, SDL_Window * window);
|
||||
extern int Android_GLES_LoadLibrary(_THIS, const char *path);
|
||||
#define Android_GLES_GetProcAddress SDL_EGL_GetProcAddress
|
||||
#define Android_GLES_UnloadLibrary SDL_EGL_UnloadLibrary
|
||||
#define Android_GLES_SetSwapInterval SDL_EGL_SetSwapInterval
|
||||
|
|
@ -65,7 +63,7 @@ extern int Android_GLES_LoadLibrary(_THIS, const char *path);
|
|||
int Android_ScreenWidth = 0;
|
||||
int Android_ScreenHeight = 0;
|
||||
Uint32 Android_ScreenFormat = SDL_PIXELFORMAT_UNKNOWN;
|
||||
int Android_ScreenRate = 0;
|
||||
static int Android_ScreenRate = 0;
|
||||
|
||||
SDL_sem *Android_PauseSem = NULL, *Android_ResumeSem = NULL;
|
||||
|
||||
|
|
@ -118,8 +116,11 @@ Android_CreateDevice(int devindex)
|
|||
device->VideoQuit = Android_VideoQuit;
|
||||
device->PumpEvents = Android_PumpEvents;
|
||||
|
||||
device->CreateWindow = Android_CreateWindow;
|
||||
device->GetDisplayDPI = Android_GetDisplayDPI;
|
||||
|
||||
device->CreateSDLWindow = Android_CreateWindow;
|
||||
device->SetWindowTitle = Android_SetWindowTitle;
|
||||
device->SetWindowFullscreen = Android_SetWindowFullscreen;
|
||||
device->DestroyWindow = Android_DestroyWindow;
|
||||
device->GetWindowWMInfo = Android_GetWindowWMInfo;
|
||||
|
||||
|
|
@ -136,6 +137,13 @@ Android_CreateDevice(int devindex)
|
|||
device->GL_SwapWindow = Android_GLES_SwapWindow;
|
||||
device->GL_DeleteContext = Android_GLES_DeleteContext;
|
||||
|
||||
#if SDL_VIDEO_VULKAN
|
||||
device->Vulkan_LoadLibrary = Android_Vulkan_LoadLibrary;
|
||||
device->Vulkan_UnloadLibrary = Android_Vulkan_UnloadLibrary;
|
||||
device->Vulkan_GetInstanceExtensions = Android_Vulkan_GetInstanceExtensions;
|
||||
device->Vulkan_CreateSurface = Android_Vulkan_CreateSurface;
|
||||
#endif
|
||||
|
||||
/* Screensaver */
|
||||
device->SuspendScreenSaver = Android_SuspendScreenSaver;
|
||||
|
||||
|
|
@ -194,9 +202,17 @@ Android_VideoQuit(_THIS)
|
|||
Android_QuitTouch();
|
||||
}
|
||||
|
||||
int
|
||||
Android_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi, float * hdpi, float * vdpi)
|
||||
{
|
||||
return Android_JNI_GetDisplayDPI(ddpi, hdpi, vdpi);
|
||||
}
|
||||
|
||||
void
|
||||
Android_SetScreenResolution(int width, int height, Uint32 format, float rate)
|
||||
{
|
||||
SDL_VideoDevice* device;
|
||||
SDL_VideoDisplay *display;
|
||||
Android_ScreenWidth = width;
|
||||
Android_ScreenHeight = height;
|
||||
Android_ScreenFormat = format;
|
||||
|
|
@ -205,13 +221,13 @@ Android_SetScreenResolution(int width, int height, Uint32 format, float rate)
|
|||
/*
|
||||
Update the resolution of the desktop mode, so that the window
|
||||
can be properly resized. The screen resolution change can for
|
||||
example happen when the Activity enters or exists immersive mode,
|
||||
example happen when the Activity enters or exits immersive mode,
|
||||
which can happen after VideoInit().
|
||||
*/
|
||||
SDL_VideoDevice* device = SDL_GetVideoDevice();
|
||||
device = SDL_GetVideoDevice();
|
||||
if (device && device->num_displays > 0)
|
||||
{
|
||||
SDL_VideoDisplay* display = &device->displays[0];
|
||||
display = &device->displays[0];
|
||||
display->desktop_mode.format = Android_ScreenFormat;
|
||||
display->desktop_mode.w = Android_ScreenWidth;
|
||||
display->desktop_mode.h = Android_ScreenHeight;
|
||||
|
|
@ -219,16 +235,17 @@ Android_SetScreenResolution(int width, int height, Uint32 format, float rate)
|
|||
}
|
||||
|
||||
if (Android_Window) {
|
||||
SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_RESIZED, width, height);
|
||||
|
||||
/* Force the current mode to match the resize otherwise the SDL_WINDOWEVENT_RESTORED event
|
||||
* will fall back to the old mode */
|
||||
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(Android_Window);
|
||||
display = SDL_GetDisplayForWindow(Android_Window);
|
||||
|
||||
display->current_mode.format = format;
|
||||
display->current_mode.w = width;
|
||||
display->current_mode.h = height;
|
||||
display->current_mode.refresh_rate = rate;
|
||||
display->display_modes[0].format = format;
|
||||
display->display_modes[0].w = width;
|
||||
display->display_modes[0].h = height;
|
||||
display->display_modes[0].refresh_rate = rate;
|
||||
display->current_mode = display->display_modes[0];
|
||||
|
||||
SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_RESIZED, width, height);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -20,8 +20,8 @@
|
|||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_androidvideo_h
|
||||
#define _SDL_androidvideo_h
|
||||
#ifndef SDL_androidvideo_h_
|
||||
#define SDL_androidvideo_h_
|
||||
|
||||
#include "SDL_mutex.h"
|
||||
#include "SDL_rect.h"
|
||||
|
|
@ -44,6 +44,6 @@ extern SDL_sem *Android_PauseSem, *Android_ResumeSem;
|
|||
extern SDL_Window *Android_Window;
|
||||
|
||||
|
||||
#endif /* _SDL_androidvideo_h */
|
||||
#endif /* SDL_androidvideo_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
175
Engine/lib/sdl/src/video/android/SDL_androidvulkan.c
Normal file
175
Engine/lib/sdl/src/video/android/SDL_androidvulkan.c
Normal file
|
|
@ -0,0 +1,175 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @author Mark Callow, www.edgewise-consulting.com. Based on Jacob Lifshay's
|
||||
* SDL_x11vulkan.c.
|
||||
*/
|
||||
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_VULKAN && SDL_VIDEO_DRIVER_ANDROID
|
||||
|
||||
#include "SDL_androidvideo.h"
|
||||
#include "SDL_androidwindow.h"
|
||||
#include "SDL_assert.h"
|
||||
|
||||
#include "SDL_loadso.h"
|
||||
#include "SDL_androidvulkan.h"
|
||||
#include "SDL_syswm.h"
|
||||
|
||||
int Android_Vulkan_LoadLibrary(_THIS, const char *path)
|
||||
{
|
||||
VkExtensionProperties *extensions = NULL;
|
||||
Uint32 i, extensionCount = 0;
|
||||
SDL_bool hasSurfaceExtension = SDL_FALSE;
|
||||
SDL_bool hasAndroidSurfaceExtension = SDL_FALSE;
|
||||
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = NULL;
|
||||
if(_this->vulkan_config.loader_handle)
|
||||
return SDL_SetError("Vulkan already loaded");
|
||||
|
||||
/* Load the Vulkan loader library */
|
||||
if(!path)
|
||||
path = SDL_getenv("SDL_VULKAN_LIBRARY");
|
||||
if(!path)
|
||||
path = "libvulkan.so";
|
||||
_this->vulkan_config.loader_handle = SDL_LoadObject(path);
|
||||
if(!_this->vulkan_config.loader_handle)
|
||||
return -1;
|
||||
SDL_strlcpy(_this->vulkan_config.loader_path, path,
|
||||
SDL_arraysize(_this->vulkan_config.loader_path));
|
||||
vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)SDL_LoadFunction(
|
||||
_this->vulkan_config.loader_handle, "vkGetInstanceProcAddr");
|
||||
if(!vkGetInstanceProcAddr)
|
||||
goto fail;
|
||||
_this->vulkan_config.vkGetInstanceProcAddr = (void *)vkGetInstanceProcAddr;
|
||||
_this->vulkan_config.vkEnumerateInstanceExtensionProperties =
|
||||
(void *)((PFN_vkGetInstanceProcAddr)_this->vulkan_config.vkGetInstanceProcAddr)(
|
||||
VK_NULL_HANDLE, "vkEnumerateInstanceExtensionProperties");
|
||||
if(!_this->vulkan_config.vkEnumerateInstanceExtensionProperties)
|
||||
goto fail;
|
||||
extensions = SDL_Vulkan_CreateInstanceExtensionsList(
|
||||
(PFN_vkEnumerateInstanceExtensionProperties)
|
||||
_this->vulkan_config.vkEnumerateInstanceExtensionProperties,
|
||||
&extensionCount);
|
||||
if(!extensions)
|
||||
goto fail;
|
||||
for(i = 0; i < extensionCount; i++)
|
||||
{
|
||||
if(SDL_strcmp(VK_KHR_SURFACE_EXTENSION_NAME, extensions[i].extensionName) == 0)
|
||||
hasSurfaceExtension = SDL_TRUE;
|
||||
else if(SDL_strcmp(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, extensions[i].extensionName) == 0)
|
||||
hasAndroidSurfaceExtension = SDL_TRUE;
|
||||
}
|
||||
SDL_free(extensions);
|
||||
if(!hasSurfaceExtension)
|
||||
{
|
||||
SDL_SetError("Installed Vulkan doesn't implement the "
|
||||
VK_KHR_SURFACE_EXTENSION_NAME " extension");
|
||||
goto fail;
|
||||
}
|
||||
else if(!hasAndroidSurfaceExtension)
|
||||
{
|
||||
SDL_SetError("Installed Vulkan doesn't implement the "
|
||||
VK_KHR_ANDROID_SURFACE_EXTENSION_NAME "extension");
|
||||
goto fail;
|
||||
}
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
SDL_UnloadObject(_this->vulkan_config.loader_handle);
|
||||
_this->vulkan_config.loader_handle = NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
void Android_Vulkan_UnloadLibrary(_THIS)
|
||||
{
|
||||
if(_this->vulkan_config.loader_handle)
|
||||
{
|
||||
SDL_UnloadObject(_this->vulkan_config.loader_handle);
|
||||
_this->vulkan_config.loader_handle = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
SDL_bool Android_Vulkan_GetInstanceExtensions(_THIS,
|
||||
SDL_Window *window,
|
||||
unsigned *count,
|
||||
const char **names)
|
||||
{
|
||||
static const char *const extensionsForAndroid[] = {
|
||||
VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_ANDROID_SURFACE_EXTENSION_NAME
|
||||
};
|
||||
if(!_this->vulkan_config.loader_handle)
|
||||
{
|
||||
SDL_SetError("Vulkan is not loaded");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
return SDL_Vulkan_GetInstanceExtensions_Helper(
|
||||
count, names, SDL_arraysize(extensionsForAndroid),
|
||||
extensionsForAndroid);
|
||||
}
|
||||
|
||||
SDL_bool Android_Vulkan_CreateSurface(_THIS,
|
||||
SDL_Window *window,
|
||||
VkInstance instance,
|
||||
VkSurfaceKHR *surface)
|
||||
{
|
||||
SDL_WindowData *windowData = (SDL_WindowData *)window->driverdata;
|
||||
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr =
|
||||
(PFN_vkGetInstanceProcAddr)_this->vulkan_config.vkGetInstanceProcAddr;
|
||||
PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR =
|
||||
(PFN_vkCreateAndroidSurfaceKHR)vkGetInstanceProcAddr(
|
||||
(VkInstance)instance,
|
||||
"vkCreateAndroidSurfaceKHR");
|
||||
VkAndroidSurfaceCreateInfoKHR createInfo;
|
||||
VkResult result;
|
||||
|
||||
if(!_this->vulkan_config.loader_handle)
|
||||
{
|
||||
SDL_SetError("Vulkan is not loaded");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if(!vkCreateAndroidSurfaceKHR)
|
||||
{
|
||||
SDL_SetError(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME
|
||||
" extension is not enabled in the Vulkan instance.");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
SDL_zero(createInfo);
|
||||
createInfo.sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR;
|
||||
createInfo.pNext = NULL;
|
||||
createInfo.flags = 0;
|
||||
createInfo.window = windowData->native_window;
|
||||
result = vkCreateAndroidSurfaceKHR(instance, &createInfo,
|
||||
NULL, surface);
|
||||
if(result != VK_SUCCESS)
|
||||
{
|
||||
SDL_SetError("vkCreateAndroidSurfaceKHR failed: %s",
|
||||
SDL_Vulkan_GetResultString(result));
|
||||
return SDL_FALSE;
|
||||
}
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
52
Engine/lib/sdl/src/video/android/SDL_androidvulkan.h
Normal file
52
Engine/lib/sdl/src/video/android/SDL_androidvulkan.h
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @author Mark Callow, www.edgewise-consulting.com. Based on Jacob Lifshay's
|
||||
* SDL_x11vulkan.h.
|
||||
*/
|
||||
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef SDL_androidvulkan_h_
|
||||
#define SDL_androidvulkan_h_
|
||||
|
||||
#include "../SDL_vulkan_internal.h"
|
||||
#include "../SDL_sysvideo.h"
|
||||
|
||||
#if SDL_VIDEO_VULKAN && SDL_VIDEO_DRIVER_ANDROID
|
||||
|
||||
int Android_Vulkan_LoadLibrary(_THIS, const char *path);
|
||||
void Android_Vulkan_UnloadLibrary(_THIS);
|
||||
SDL_bool Android_Vulkan_GetInstanceExtensions(_THIS,
|
||||
SDL_Window *window,
|
||||
unsigned *count,
|
||||
const char **names);
|
||||
SDL_bool Android_Vulkan_CreateSurface(_THIS,
|
||||
SDL_Window *window,
|
||||
VkInstance instance,
|
||||
VkSurfaceKHR *surface);
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* SDL_androidvulkan_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -29,6 +29,7 @@
|
|||
|
||||
#include "SDL_androidvideo.h"
|
||||
#include "SDL_androidwindow.h"
|
||||
#include "SDL_hints.h"
|
||||
|
||||
int
|
||||
Android_CreateWindow(_THIS, SDL_Window * window)
|
||||
|
|
@ -42,6 +43,9 @@ Android_CreateWindow(_THIS, SDL_Window * window)
|
|||
Android_PauseSem = SDL_CreateSemaphore(0);
|
||||
Android_ResumeSem = SDL_CreateSemaphore(0);
|
||||
|
||||
/* Set orientation */
|
||||
Android_JNI_SetOrientation(window->w, window->h, window->flags & SDL_WINDOW_RESIZABLE, SDL_GetHint(SDL_HINT_ORIENTATIONS));
|
||||
|
||||
/* Adjust the window data to match the screen */
|
||||
window->x = 0;
|
||||
window->y = 0;
|
||||
|
|
@ -49,7 +53,6 @@ Android_CreateWindow(_THIS, SDL_Window * window)
|
|||
window->h = Android_ScreenHeight;
|
||||
|
||||
window->flags &= ~SDL_WINDOW_RESIZABLE; /* window is NEVER resizeable */
|
||||
window->flags |= SDL_WINDOW_FULLSCREEN; /* window is always fullscreen */
|
||||
window->flags &= ~SDL_WINDOW_HIDDEN;
|
||||
window->flags |= SDL_WINDOW_SHOWN; /* only one window on Android */
|
||||
window->flags |= SDL_WINDOW_INPUT_FOCUS; /* always has input focus */
|
||||
|
|
@ -69,13 +72,17 @@ Android_CreateWindow(_THIS, SDL_Window * window)
|
|||
SDL_free(data);
|
||||
return SDL_SetError("Could not fetch native window");
|
||||
}
|
||||
|
||||
data->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) data->native_window);
|
||||
|
||||
if (data->egl_surface == EGL_NO_SURFACE) {
|
||||
ANativeWindow_release(data->native_window);
|
||||
SDL_free(data);
|
||||
return SDL_SetError("Could not create GLES window surface");
|
||||
/* Do not create EGLSurface for Vulkan window since it will then make the window
|
||||
incompatible with vkCreateAndroidSurfaceKHR */
|
||||
if ((window->flags & SDL_WINDOW_VULKAN) == 0) {
|
||||
data->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) data->native_window);
|
||||
|
||||
if (data->egl_surface == EGL_NO_SURFACE) {
|
||||
ANativeWindow_release(data->native_window);
|
||||
SDL_free(data);
|
||||
return SDL_SetError("Could not create GLES window surface");
|
||||
}
|
||||
}
|
||||
|
||||
window->driverdata = data;
|
||||
|
|
@ -90,6 +97,12 @@ Android_SetWindowTitle(_THIS, SDL_Window * window)
|
|||
Android_JNI_SetActivityTitle(window->title);
|
||||
}
|
||||
|
||||
void
|
||||
Android_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen)
|
||||
{
|
||||
Android_JNI_SetWindowStyle(fullscreen);
|
||||
}
|
||||
|
||||
void
|
||||
Android_DestroyWindow(_THIS, SDL_Window * window)
|
||||
{
|
||||
|
|
@ -128,7 +141,7 @@ Android_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info)
|
|||
info->info.android.surface = data->egl_surface;
|
||||
return SDL_TRUE;
|
||||
} else {
|
||||
SDL_SetError("Application not compiled with SDL %d.%d\n",
|
||||
SDL_SetError("Application not compiled with SDL %d.%d",
|
||||
SDL_MAJOR_VERSION, SDL_MINOR_VERSION);
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -20,14 +20,15 @@
|
|||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_androidwindow_h
|
||||
#define _SDL_androidwindow_h
|
||||
#ifndef SDL_androidwindow_h_
|
||||
#define SDL_androidwindow_h_
|
||||
|
||||
#include "../../core/android/SDL_android.h"
|
||||
#include "../SDL_egl_c.h"
|
||||
|
||||
extern int Android_CreateWindow(_THIS, SDL_Window * window);
|
||||
extern void Android_SetWindowTitle(_THIS, SDL_Window * window);
|
||||
extern void Android_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen);
|
||||
extern void Android_DestroyWindow(_THIS, SDL_Window * window);
|
||||
extern SDL_bool Android_GetWindowWMInfo(_THIS, SDL_Window * window, struct SDL_SysWMinfo * info);
|
||||
|
||||
|
|
@ -39,6 +40,6 @@ typedef struct
|
|||
|
||||
} SDL_WindowData;
|
||||
|
||||
#endif /* _SDL_androidwindow_h */
|
||||
#endif /* SDL_androidwindow_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -20,8 +20,8 @@
|
|||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoaclipboard_h
|
||||
#define _SDL_cocoaclipboard_h
|
||||
#ifndef SDL_cocoaclipboard_h_
|
||||
#define SDL_cocoaclipboard_h_
|
||||
|
||||
/* Forward declaration */
|
||||
struct SDL_VideoData;
|
||||
|
|
@ -31,6 +31,6 @@ extern char *Cocoa_GetClipboardText(_THIS);
|
|||
extern SDL_bool Cocoa_HasClipboardText(_THIS);
|
||||
extern void Cocoa_CheckClipboardUpdate(struct SDL_VideoData * data);
|
||||
|
||||
#endif /* _SDL_cocoaclipboard_h */
|
||||
#endif /* SDL_cocoaclipboard_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -20,13 +20,13 @@
|
|||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoaevents_h
|
||||
#define _SDL_cocoaevents_h
|
||||
#ifndef SDL_cocoaevents_h_
|
||||
#define SDL_cocoaevents_h_
|
||||
|
||||
extern void Cocoa_RegisterApp(void);
|
||||
extern void Cocoa_PumpEvents(_THIS);
|
||||
extern void Cocoa_SuspendScreenSaver(_THIS);
|
||||
|
||||
#endif /* _SDL_cocoaevents_h */
|
||||
#endif /* SDL_cocoaevents_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -38,6 +38,8 @@
|
|||
- (void)terminate:(id)sender;
|
||||
- (void)sendEvent:(NSEvent *)theEvent;
|
||||
|
||||
+ (void)registerUserDefaults;
|
||||
|
||||
@end
|
||||
|
||||
@implementation SDLApplication
|
||||
|
|
@ -55,22 +57,22 @@ static void Cocoa_DispatchEvent(NSEvent *theEvent)
|
|||
SDL_VideoDevice *_this = SDL_GetVideoDevice();
|
||||
|
||||
switch ([theEvent type]) {
|
||||
case NSLeftMouseDown:
|
||||
case NSOtherMouseDown:
|
||||
case NSRightMouseDown:
|
||||
case NSLeftMouseUp:
|
||||
case NSOtherMouseUp:
|
||||
case NSRightMouseUp:
|
||||
case NSLeftMouseDragged:
|
||||
case NSRightMouseDragged:
|
||||
case NSOtherMouseDragged: /* usually middle mouse dragged */
|
||||
case NSMouseMoved:
|
||||
case NSScrollWheel:
|
||||
case NSEventTypeLeftMouseDown:
|
||||
case NSEventTypeOtherMouseDown:
|
||||
case NSEventTypeRightMouseDown:
|
||||
case NSEventTypeLeftMouseUp:
|
||||
case NSEventTypeOtherMouseUp:
|
||||
case NSEventTypeRightMouseUp:
|
||||
case NSEventTypeLeftMouseDragged:
|
||||
case NSEventTypeRightMouseDragged:
|
||||
case NSEventTypeOtherMouseDragged: /* usually middle mouse dragged */
|
||||
case NSEventTypeMouseMoved:
|
||||
case NSEventTypeScrollWheel:
|
||||
Cocoa_HandleMouseEvent(_this, theEvent);
|
||||
break;
|
||||
case NSKeyDown:
|
||||
case NSKeyUp:
|
||||
case NSFlagsChanged:
|
||||
case NSEventTypeKeyDown:
|
||||
case NSEventTypeKeyUp:
|
||||
case NSEventTypeFlagsChanged:
|
||||
Cocoa_HandleKeyEvent(_this, theEvent);
|
||||
break;
|
||||
default:
|
||||
|
|
@ -90,6 +92,17 @@ static void Cocoa_DispatchEvent(NSEvent *theEvent)
|
|||
[super sendEvent:theEvent];
|
||||
}
|
||||
|
||||
+ (void)registerUserDefaults
|
||||
{
|
||||
NSDictionary *appDefaults = [[NSDictionary alloc] initWithObjectsAndKeys:
|
||||
[NSNumber numberWithBool:NO], @"AppleMomentumScrollSupported",
|
||||
[NSNumber numberWithBool:NO], @"ApplePressAndHoldEnabled",
|
||||
[NSNumber numberWithBool:YES], @"ApplePersistenceIgnoreState",
|
||||
nil];
|
||||
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
|
||||
[appDefaults release];
|
||||
}
|
||||
|
||||
@end // SDLApplication
|
||||
|
||||
/* setAppleMenu disappeared from the headers in 10.4 */
|
||||
|
|
@ -216,6 +229,22 @@ static void Cocoa_DispatchEvent(NSEvent *theEvent)
|
|||
{
|
||||
return (BOOL)SDL_SendDropFile(NULL, [filename UTF8String]) && SDL_SendDropComplete(NULL);
|
||||
}
|
||||
|
||||
- (void)applicationDidFinishLaunching:(NSNotification *)notification
|
||||
{
|
||||
/* The menu bar of SDL apps which don't have the typical .app bundle
|
||||
* structure fails to work the first time a window is created (until it's
|
||||
* de-focused and re-focused), if this call is in Cocoa_RegisterApp instead
|
||||
* of here. https://bugzilla.libsdl.org/show_bug.cgi?id=3051
|
||||
*/
|
||||
if (!SDL_GetHintBoolean(SDL_HINT_MAC_BACKGROUND_APP, SDL_FALSE)) {
|
||||
[NSApp activateIgnoringOtherApps:YES];
|
||||
}
|
||||
|
||||
/* If we call this before NSApp activation, macOS might print a complaint
|
||||
* about ApplePersistenceIgnoreState. */
|
||||
[SDLApplication registerUserDefaults];
|
||||
}
|
||||
@end
|
||||
|
||||
static SDLAppDelegate *appDelegate = nil;
|
||||
|
|
@ -289,7 +318,7 @@ CreateApplicationMenus(void)
|
|||
[appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@"h"];
|
||||
|
||||
menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"];
|
||||
[menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)];
|
||||
[menuItem setKeyEquivalentModifierMask:(NSEventModifierFlagOption|NSEventModifierFlagCommand)];
|
||||
|
||||
[appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""];
|
||||
|
||||
|
|
@ -335,7 +364,7 @@ CreateApplicationMenus(void)
|
|||
|
||||
/* Add menu items */
|
||||
menuItem = [viewMenu addItemWithTitle:@"Toggle Full Screen" action:@selector(toggleFullScreen:) keyEquivalent:@"f"];
|
||||
[menuItem setKeyEquivalentModifierMask:NSControlKeyMask | NSCommandKeyMask];
|
||||
[menuItem setKeyEquivalentModifierMask:NSEventModifierFlagControl | NSEventModifierFlagCommand];
|
||||
|
||||
/* Put menu into the menubar */
|
||||
menuItem = [[NSMenuItem alloc] initWithTitle:@"View" action:nil keyEquivalent:@""];
|
||||
|
|
@ -361,20 +390,18 @@ Cocoa_RegisterApp(void)
|
|||
|
||||
if (!SDL_GetHintBoolean(SDL_HINT_MAC_BACKGROUND_APP, SDL_FALSE)) {
|
||||
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
|
||||
[NSApp activateIgnoringOtherApps:YES];
|
||||
}
|
||||
|
||||
if ([NSApp mainMenu] == nil) {
|
||||
CreateApplicationMenus();
|
||||
}
|
||||
[NSApp finishLaunching];
|
||||
NSDictionary *appDefaults = [[NSDictionary alloc] initWithObjectsAndKeys:
|
||||
[NSNumber numberWithBool:NO], @"AppleMomentumScrollSupported",
|
||||
[NSNumber numberWithBool:NO], @"ApplePressAndHoldEnabled",
|
||||
[NSNumber numberWithBool:YES], @"ApplePersistenceIgnoreState",
|
||||
nil];
|
||||
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
|
||||
[appDefaults release];
|
||||
if ([NSApp delegate]) {
|
||||
/* The SDL app delegate calls this in didFinishLaunching if it's
|
||||
* attached to the NSApp, otherwise we need to call it manually.
|
||||
*/
|
||||
[SDLApplication registerUserDefaults];
|
||||
}
|
||||
}
|
||||
if (NSApp && !appDelegate) {
|
||||
appDelegate = [[SDLAppDelegate alloc] init];
|
||||
|
|
@ -394,6 +421,7 @@ void
|
|||
Cocoa_PumpEvents(_THIS)
|
||||
{ @autoreleasepool
|
||||
{
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070
|
||||
/* Update activity every 30 seconds to prevent screensaver */
|
||||
SDL_VideoData *data = (SDL_VideoData *)_this->driverdata;
|
||||
if (_this->suspend_screensaver && !data->screensaver_use_iopm) {
|
||||
|
|
@ -404,9 +432,10 @@ Cocoa_PumpEvents(_THIS)
|
|||
data->screensaver_activity = now;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
for ( ; ; ) {
|
||||
NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES ];
|
||||
NSEvent *event = [NSApp nextEventMatchingMask:NSEventMaskAny untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES ];
|
||||
if ( event == nil ) {
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -20,8 +20,8 @@
|
|||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoakeyboard_h
|
||||
#define _SDL_cocoakeyboard_h
|
||||
#ifndef SDL_cocoakeyboard_h_
|
||||
#define SDL_cocoakeyboard_h_
|
||||
|
||||
extern void Cocoa_InitKeyboard(_THIS);
|
||||
extern void Cocoa_HandleKeyEvent(_THIS, NSEvent * event);
|
||||
|
|
@ -31,6 +31,6 @@ extern void Cocoa_StartTextInput(_THIS);
|
|||
extern void Cocoa_StopTextInput(_THIS);
|
||||
extern void Cocoa_SetTextInputRect(_THIS, SDL_Rect *rect);
|
||||
|
||||
#endif /* _SDL_cocoakeyboard_h */
|
||||
#endif /* SDL_cocoakeyboard_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -93,7 +93,7 @@
|
|||
return _selectedRange;
|
||||
}
|
||||
|
||||
- (void)setMarkedText:(id)aString selectedRange:(NSRange)selectedRange replacementRange:(NSRange)replacementRange;
|
||||
- (void)setMarkedText:(id)aString selectedRange:(NSRange)selectedRange replacementRange:(NSRange)replacementRange
|
||||
{
|
||||
if ([aString isKindOfClass:[NSAttributedString class]]) {
|
||||
aString = [aString string];
|
||||
|
|
@ -127,7 +127,7 @@
|
|||
SDL_SendEditingText("", 0, 0);
|
||||
}
|
||||
|
||||
- (NSRect)firstRectForCharacterRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange;
|
||||
- (NSRect)firstRectForCharacterRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange
|
||||
{
|
||||
NSWindow *window = [self window];
|
||||
NSRect contentRect = [window contentRectForFrameRect:[window frame]];
|
||||
|
|
@ -143,16 +143,19 @@
|
|||
aRange.location, aRange.length, windowHeight,
|
||||
NSStringFromRect(rect));
|
||||
|
||||
if ([window respondsToSelector:@selector(convertRectToScreen:)]) {
|
||||
rect = [window convertRectToScreen:rect];
|
||||
} else {
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070
|
||||
if (![window respondsToSelector:@selector(convertRectToScreen:)]) {
|
||||
rect.origin = [window convertBaseToScreen:rect.origin];
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
rect = [window convertRectToScreen:rect];
|
||||
}
|
||||
|
||||
return rect;
|
||||
}
|
||||
|
||||
- (NSAttributedString *)attributedSubstringForProposedRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange;
|
||||
- (NSAttributedString *)attributedSubstringForProposedRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange
|
||||
{
|
||||
DEBUG_IME(@"attributedSubstringFromRange: (%d, %d)", aRange.location, aRange.length);
|
||||
return nil;
|
||||
|
|
@ -460,7 +463,7 @@ DoSidedModifiers(unsigned short scancode,
|
|||
unsigned int i, bit;
|
||||
|
||||
/* Iterate through the bits, testing each against the old modifiers */
|
||||
for (i = 0, bit = NSShiftKeyMask; bit <= NSCommandKeyMask; bit <<= 1, ++i) {
|
||||
for (i = 0, bit = NSEventModifierFlagShift; bit <= NSEventModifierFlagCommand; bit <<= 1, ++i) {
|
||||
unsigned int oldMask, newMask;
|
||||
|
||||
oldMask = oldMods & bit;
|
||||
|
|
@ -581,7 +584,7 @@ Cocoa_InitKeyboard(_THIS)
|
|||
SDL_SetScancodeName(SDL_SCANCODE_RGUI, "Right Command");
|
||||
|
||||
data->modifierFlags = [NSEvent modifierFlags];
|
||||
SDL_ToggleModState(KMOD_CAPS, (data->modifierFlags & NSAlphaShiftKeyMask) != 0);
|
||||
SDL_ToggleModState(KMOD_CAPS, (data->modifierFlags & NSEventModifierFlagCapsLock) != 0);
|
||||
|
||||
InitHIDCallback();
|
||||
}
|
||||
|
|
@ -646,7 +649,7 @@ Cocoa_SetTextInputRect(_THIS, SDL_Rect *rect)
|
|||
void
|
||||
Cocoa_HandleKeyEvent(_THIS, NSEvent *event)
|
||||
{
|
||||
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
|
||||
SDL_VideoData *data = _this ? ((SDL_VideoData *) _this->driverdata) : NULL;
|
||||
if (!data) {
|
||||
return; /* can happen when returning from fullscreen Space on shutdown */
|
||||
}
|
||||
|
|
@ -670,7 +673,7 @@ Cocoa_HandleKeyEvent(_THIS, NSEvent *event)
|
|||
}
|
||||
|
||||
switch ([event type]) {
|
||||
case NSKeyDown:
|
||||
case NSEventTypeKeyDown:
|
||||
if (![event isARepeat]) {
|
||||
/* See if we need to rebuild the keyboard layout */
|
||||
UpdateKeymap(data, SDL_TRUE);
|
||||
|
|
@ -679,7 +682,7 @@ Cocoa_HandleKeyEvent(_THIS, NSEvent *event)
|
|||
SDL_SendKeyboardKey(SDL_PRESSED, code);
|
||||
#if 1
|
||||
if (code == SDL_SCANCODE_UNKNOWN) {
|
||||
fprintf(stderr, "The key you just pressed is not recognized by SDL. To help get this fixed, report this to the SDL mailing list <sdl@libsdl.org> or to Christian Walther <cwalther@gmx.ch>. Mac virtual key code is %d.\n", scancode);
|
||||
fprintf(stderr, "The key you just pressed is not recognized by SDL. To help get this fixed, report this to the SDL forums/mailing list <https://discourse.libsdl.org/> or to Christian Walther <cwalther@gmx.ch>. Mac virtual key code is %d.\n", scancode);
|
||||
}
|
||||
#endif
|
||||
if (SDL_EventState(SDL_TEXTINPUT, SDL_QUERY)) {
|
||||
|
|
@ -694,10 +697,10 @@ Cocoa_HandleKeyEvent(_THIS, NSEvent *event)
|
|||
#endif
|
||||
}
|
||||
break;
|
||||
case NSKeyUp:
|
||||
case NSEventTypeKeyUp:
|
||||
SDL_SendKeyboardKey(SDL_RELEASED, code);
|
||||
break;
|
||||
case NSFlagsChanged:
|
||||
case NSEventTypeFlagsChanged:
|
||||
/* FIXME CW 2007-08-14: check if this whole mess that takes up half of this file is really necessary */
|
||||
HandleModifiers(_this, scancode, [event modifierFlags]);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -57,11 +57,24 @@
|
|||
- (void)showAlert:(NSAlert*)alert
|
||||
{
|
||||
if (nswindow) {
|
||||
[alert beginSheetModalForWindow:nswindow modalDelegate:self didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) contextInfo:nil];
|
||||
#ifdef MAC_OS_X_VERSION_10_9
|
||||
if ([alert respondsToSelector:@selector(beginSheetModalForWindow:completionHandler:)]) {
|
||||
[alert beginSheetModalForWindow:nswindow completionHandler:^(NSModalResponse returnCode) {
|
||||
clicked = returnCode;
|
||||
}];
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED < 1090
|
||||
[alert beginSheetModalForWindow:nswindow modalDelegate:self didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) contextInfo:nil];
|
||||
#endif
|
||||
}
|
||||
|
||||
while (clicked < 0) {
|
||||
SDL_PumpEvents();
|
||||
SDL_Delay(100);
|
||||
}
|
||||
|
||||
[nswindow release];
|
||||
} else {
|
||||
clicked = [alert runModal];
|
||||
|
|
@ -86,11 +99,11 @@ Cocoa_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
|
|||
NSAlert* alert = [[[NSAlert alloc] init] autorelease];
|
||||
|
||||
if (messageboxdata->flags & SDL_MESSAGEBOX_ERROR) {
|
||||
[alert setAlertStyle:NSCriticalAlertStyle];
|
||||
[alert setAlertStyle:NSAlertStyleCritical];
|
||||
} else if (messageboxdata->flags & SDL_MESSAGEBOX_WARNING) {
|
||||
[alert setAlertStyle:NSWarningAlertStyle];
|
||||
[alert setAlertStyle:NSAlertStyleWarning];
|
||||
} else {
|
||||
[alert setAlertStyle:NSInformationalAlertStyle];
|
||||
[alert setAlertStyle:NSAlertStyleInformational];
|
||||
}
|
||||
|
||||
[alert setMessageText:[NSString stringWithUTF8String:messageboxdata->title]];
|
||||
|
|
|
|||
63
Engine/lib/sdl/src/video/cocoa/SDL_cocoametalview.h
Normal file
63
Engine/lib/sdl/src/video/cocoa/SDL_cocoametalview.h
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
/*
|
||||
* @author Mark Callow, www.edgewise-consulting.com.
|
||||
*
|
||||
* Thanks to Alex Szpakowski, @slime73 on GitHub, for his gist showing
|
||||
* how to add a CAMetalLayer backed view.
|
||||
*/
|
||||
|
||||
#ifndef SDL_cocoametalview_h_
|
||||
#define SDL_cocoametalview_h_
|
||||
|
||||
#import "../SDL_sysvideo.h"
|
||||
#import "SDL_cocoawindow.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_COCOA && (SDL_VIDEO_VULKAN || SDL_VIDEO_RENDER_METAL)
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#import <Metal/Metal.h>
|
||||
#import <QuartzCore/CAMetalLayer.h>
|
||||
|
||||
#define METALVIEW_TAG 255
|
||||
|
||||
@interface SDL_cocoametalview : NSView {
|
||||
NSInteger _tag;
|
||||
}
|
||||
|
||||
- (instancetype)initWithFrame:(NSRect)frame
|
||||
scale:(CGFloat)scale;
|
||||
|
||||
/* Override superclass tag so this class can set it. */
|
||||
@property (assign, readonly) NSInteger tag;
|
||||
|
||||
@end
|
||||
|
||||
SDL_cocoametalview* Cocoa_Mtl_AddMetalView(SDL_Window* window);
|
||||
|
||||
void Cocoa_Mtl_GetDrawableSize(SDL_Window * window, int * w, int * h);
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_COCOA && (SDL_VIDEO_VULKAN || SDL_VIDEO_RENDER_METAL) */
|
||||
|
||||
#endif /* SDL_cocoametalview_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
||||
135
Engine/lib/sdl/src/video/cocoa/SDL_cocoametalview.m
Normal file
135
Engine/lib/sdl/src/video/cocoa/SDL_cocoametalview.m
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
/*
|
||||
* @author Mark Callow, www.edgewise-consulting.com.
|
||||
*
|
||||
* Thanks to Alex Szpakowski, @slime73 on GitHub, for his gist showing
|
||||
* how to add a CAMetalLayer backed view.
|
||||
*/
|
||||
|
||||
#import "SDL_cocoametalview.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_COCOA && (SDL_VIDEO_VULKAN || SDL_VIDEO_RENDER_METAL)
|
||||
|
||||
#include "SDL_assert.h"
|
||||
|
||||
@implementation SDL_cocoametalview
|
||||
|
||||
/* The synthesized getter should be called by super's viewWithTag. */
|
||||
@synthesize tag = _tag;
|
||||
|
||||
/* Return a Metal-compatible layer. */
|
||||
+ (Class)layerClass
|
||||
{
|
||||
return NSClassFromString(@"CAMetalLayer");
|
||||
}
|
||||
|
||||
/* Indicate the view wants to draw using a backing layer instead of drawRect. */
|
||||
- (BOOL)wantsUpdateLayer
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
/* When the wantsLayer property is set to YES, this method will be invoked to
|
||||
* return a layer instance.
|
||||
*/
|
||||
- (CALayer*)makeBackingLayer
|
||||
{
|
||||
return [self.class.layerClass layer];
|
||||
}
|
||||
|
||||
- (instancetype)initWithFrame:(NSRect)frame
|
||||
scale:(CGFloat)scale
|
||||
{
|
||||
if ((self = [super initWithFrame:frame])) {
|
||||
_tag = METALVIEW_TAG;
|
||||
self.wantsLayer = YES;
|
||||
|
||||
/* Allow resize. */
|
||||
self.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
|
||||
|
||||
/* Set the desired scale. The default drawableSize of a CAMetalLayer
|
||||
* is its bounds x its scale so nothing further needs to be done.
|
||||
*/
|
||||
self.layer.contentsScale = scale;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
/* Set the size of the metal drawables when the view is resized. */
|
||||
- (void)resizeWithOldSuperviewSize:(NSSize)oldSize
|
||||
{
|
||||
[super resizeWithOldSuperviewSize:oldSize];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
SDL_cocoametalview*
|
||||
Cocoa_Mtl_AddMetalView(SDL_Window* window)
|
||||
{
|
||||
SDL_WindowData* data = (__bridge SDL_WindowData *)window->driverdata;
|
||||
NSView *view = data->nswindow.contentView;
|
||||
CGFloat scale = 1.0;
|
||||
|
||||
if (window->flags & SDL_WINDOW_ALLOW_HIGHDPI) {
|
||||
/* Set the scale to the natural scale factor of the screen - then
|
||||
* the backing dimensions of the Metal view will match the pixel
|
||||
* dimensions of the screen rather than the dimensions in points
|
||||
* yielding high resolution on retine displays.
|
||||
*
|
||||
* N.B. In order for backingScaleFactor to be > 1,
|
||||
* NSHighResolutionCapable must be set to true in the app's Info.plist.
|
||||
*/
|
||||
NSWindow* nswindow = data->nswindow;
|
||||
if ([nswindow.screen respondsToSelector:@selector(backingScaleFactor)])
|
||||
scale = data->nswindow.screen.backingScaleFactor;
|
||||
}
|
||||
|
||||
SDL_cocoametalview *metalview
|
||||
= [[SDL_cocoametalview alloc] initWithFrame:view.frame scale:scale];
|
||||
[view addSubview:metalview];
|
||||
return metalview;
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_Mtl_GetDrawableSize(SDL_Window * window, int * w, int * h)
|
||||
{
|
||||
SDL_WindowData *data = (__bridge SDL_WindowData *)window->driverdata;
|
||||
NSView *view = data->nswindow.contentView;
|
||||
SDL_cocoametalview* metalview = [view viewWithTag:METALVIEW_TAG];
|
||||
if (metalview) {
|
||||
CAMetalLayer *layer = (CAMetalLayer*)metalview.layer;
|
||||
assert(layer != NULL);
|
||||
if (w) {
|
||||
*w = layer.drawableSize.width;
|
||||
}
|
||||
if (h) {
|
||||
*h = layer.drawableSize.height;
|
||||
}
|
||||
} else {
|
||||
SDL_GetWindowSize(window, w, h);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_COCOA && (SDL_VIDEO_VULKAN || SDL_VIDEO_RENDER_METAL) */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -20,8 +20,8 @@
|
|||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoamodes_h
|
||||
#define _SDL_cocoamodes_h
|
||||
#ifndef SDL_cocoamodes_h_
|
||||
#define SDL_cocoamodes_h_
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
|
@ -41,6 +41,6 @@ extern int Cocoa_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi,
|
|||
extern int Cocoa_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode);
|
||||
extern void Cocoa_QuitModes(_THIS);
|
||||
|
||||
#endif /* _SDL_cocoamodes_h */
|
||||
#endif /* SDL_cocoamodes_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -340,27 +340,53 @@ void
|
|||
Cocoa_GetDisplayModes(_THIS, SDL_VideoDisplay * display)
|
||||
{
|
||||
SDL_DisplayData *data = (SDL_DisplayData *) display->driverdata;
|
||||
CFArrayRef modes = CGDisplayCopyAllDisplayModes(data->display, NULL);
|
||||
CVDisplayLinkRef link = NULL;
|
||||
CGDisplayModeRef desktopmoderef;
|
||||
SDL_DisplayMode desktopmode;
|
||||
CFArrayRef modes;
|
||||
|
||||
CVDisplayLinkCreateWithCGDisplay(data->display, &link);
|
||||
|
||||
desktopmoderef = CGDisplayCopyDisplayMode(data->display);
|
||||
|
||||
/* CopyAllDisplayModes won't always contain the desktop display mode (if
|
||||
* NULL is passed in) - for example on a retina 15" MBP, System Preferences
|
||||
* allows choosing 1920x1200 but it's not in the list. AddDisplayMode makes
|
||||
* sure there are no duplicates so it's safe to always add the desktop mode
|
||||
* even in cases where it is in the CopyAllDisplayModes list.
|
||||
*/
|
||||
if (desktopmoderef && GetDisplayMode(_this, desktopmoderef, link, &desktopmode)) {
|
||||
if (!SDL_AddDisplayMode(display, &desktopmode)) {
|
||||
CGDisplayModeRelease(desktopmoderef);
|
||||
SDL_free(desktopmode.driverdata);
|
||||
}
|
||||
} else {
|
||||
CGDisplayModeRelease(desktopmoderef);
|
||||
}
|
||||
|
||||
modes = CGDisplayCopyAllDisplayModes(data->display, NULL);
|
||||
|
||||
if (modes) {
|
||||
CVDisplayLinkRef link = NULL;
|
||||
const CFIndex count = CFArrayGetCount(modes);
|
||||
CFIndex i;
|
||||
|
||||
CVDisplayLinkCreateWithCGDisplay(data->display, &link);
|
||||
const CFIndex count = CFArrayGetCount(modes);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
CGDisplayModeRef moderef = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i);
|
||||
SDL_DisplayMode mode;
|
||||
|
||||
if (GetDisplayMode(_this, moderef, link, &mode)) {
|
||||
CGDisplayModeRetain(moderef);
|
||||
SDL_AddDisplayMode(display, &mode);
|
||||
if (SDL_AddDisplayMode(display, &mode)) {
|
||||
CGDisplayModeRetain(moderef);
|
||||
} else {
|
||||
SDL_free(mode.driverdata);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CVDisplayLinkRelease(link);
|
||||
CFRelease(modes);
|
||||
}
|
||||
|
||||
CVDisplayLinkRelease(link);
|
||||
}
|
||||
|
||||
int
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -20,8 +20,8 @@
|
|||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoamouse_h
|
||||
#define _SDL_cocoamouse_h
|
||||
#ifndef SDL_cocoamouse_h_
|
||||
#define SDL_cocoamouse_h_
|
||||
|
||||
#include "SDL_cocoavideo.h"
|
||||
|
||||
|
|
@ -47,6 +47,6 @@ typedef struct {
|
|||
+ (NSCursor *)invisibleCursor;
|
||||
@end
|
||||
|
||||
#endif /* _SDL_cocoamouse_h */
|
||||
#endif /* SDL_cocoamouse_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -26,6 +26,7 @@
|
|||
#include "SDL_events.h"
|
||||
#include "SDL_cocoamouse.h"
|
||||
#include "SDL_cocoamousetap.h"
|
||||
#include "SDL_cocoavideo.h"
|
||||
|
||||
#include "../../events/SDL_mouse_c.h"
|
||||
|
||||
|
|
@ -363,10 +364,10 @@ void
|
|||
Cocoa_HandleMouseEvent(_THIS, NSEvent *event)
|
||||
{
|
||||
switch ([event type]) {
|
||||
case NSMouseMoved:
|
||||
case NSLeftMouseDragged:
|
||||
case NSRightMouseDragged:
|
||||
case NSOtherMouseDragged:
|
||||
case NSEventTypeMouseMoved:
|
||||
case NSEventTypeLeftMouseDragged:
|
||||
case NSEventTypeRightMouseDragged:
|
||||
case NSEventTypeOtherMouseDragged:
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
@ -431,17 +432,7 @@ Cocoa_HandleMouseWheel(SDL_Window *window, NSEvent *event)
|
|||
}
|
||||
}
|
||||
|
||||
if (x > 0) {
|
||||
x = SDL_ceil(x);
|
||||
} else if (x < 0) {
|
||||
x = SDL_floor(x);
|
||||
}
|
||||
if (y > 0) {
|
||||
y = SDL_ceil(y);
|
||||
} else if (y < 0) {
|
||||
y = SDL_floor(y);
|
||||
}
|
||||
SDL_SendMouseWheel(window, mouse->mouseID, (int)x, (int)y, direction);
|
||||
SDL_SendMouseWheel(window, mouse->mouseID, x, y, direction);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -20,14 +20,15 @@
|
|||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoamousetap_h
|
||||
#define _SDL_cocoamousetap_h
|
||||
#ifndef SDL_cocoamousetap_h_
|
||||
#define SDL_cocoamousetap_h_
|
||||
|
||||
#include "SDL_cocoamouse.h"
|
||||
|
||||
extern void Cocoa_InitMouseEventTap(SDL_MouseData *driverdata);
|
||||
extern void Cocoa_EnableMouseEventTap(SDL_MouseData *driverdata, SDL_bool enabled);
|
||||
extern void Cocoa_QuitMouseEventTap(SDL_MouseData *driverdata);
|
||||
|
||||
#endif /* _SDL_cocoamousetap_h */
|
||||
#endif /* SDL_cocoamousetap_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -69,11 +69,14 @@ Cocoa_MouseTapCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event
|
|||
|
||||
switch (type) {
|
||||
case kCGEventTapDisabledByTimeout:
|
||||
case kCGEventTapDisabledByUserInput:
|
||||
{
|
||||
CGEventTapEnable(tapdata->tap, true);
|
||||
return NULL;
|
||||
}
|
||||
case kCGEventTapDisabledByUserInput:
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -142,15 +145,12 @@ Cocoa_MouseTapThread(void *data)
|
|||
{
|
||||
SDL_MouseEventTapData *tapdata = (SDL_MouseEventTapData*)data;
|
||||
|
||||
/* Create a tap. */
|
||||
CFMachPortRef eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap,
|
||||
kCGEventTapOptionDefault, allGrabbedEventsMask,
|
||||
&Cocoa_MouseTapCallback, tapdata);
|
||||
/* Tap was created on main thread but we own it now. */
|
||||
CFMachPortRef eventTap = tapdata->tap;
|
||||
if (eventTap) {
|
||||
/* Try to create a runloop source we can schedule. */
|
||||
CFRunLoopSourceRef runloopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
|
||||
if (runloopSource) {
|
||||
tapdata->tap = eventTap;
|
||||
tapdata->runloopSource = runloopSource;
|
||||
} else {
|
||||
CFRelease(eventTap);
|
||||
|
|
@ -202,15 +202,32 @@ Cocoa_InitMouseEventTap(SDL_MouseData* driverdata)
|
|||
|
||||
tapdata->runloopStartedSemaphore = SDL_CreateSemaphore(0);
|
||||
if (tapdata->runloopStartedSemaphore) {
|
||||
tapdata->thread = SDL_CreateThreadInternal(&Cocoa_MouseTapThread, "Event Tap Loop", 512 * 1024, tapdata);
|
||||
if (!tapdata->thread) {
|
||||
SDL_DestroySemaphore(tapdata->runloopStartedSemaphore);
|
||||
tapdata->tap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap,
|
||||
kCGEventTapOptionDefault, allGrabbedEventsMask,
|
||||
&Cocoa_MouseTapCallback, tapdata);
|
||||
if (tapdata->tap) {
|
||||
/* Tap starts disabled, until app requests mouse grab */
|
||||
CGEventTapEnable(tapdata->tap, false);
|
||||
tapdata->thread = SDL_CreateThreadInternal(&Cocoa_MouseTapThread, "Event Tap Loop", 512 * 1024, tapdata);
|
||||
if (tapdata->thread) {
|
||||
/* Success - early out. Ownership transferred to thread. */
|
||||
return;
|
||||
}
|
||||
CFRelease(tapdata->tap);
|
||||
}
|
||||
SDL_DestroySemaphore(tapdata->runloopStartedSemaphore);
|
||||
}
|
||||
SDL_free(driverdata->tapdata);
|
||||
driverdata->tapdata = NULL;
|
||||
}
|
||||
|
||||
if (!tapdata->thread) {
|
||||
SDL_free(driverdata->tapdata);
|
||||
driverdata->tapdata = NULL;
|
||||
void
|
||||
Cocoa_EnableMouseEventTap(SDL_MouseData *driverdata, SDL_bool enabled)
|
||||
{
|
||||
SDL_MouseEventTapData *tapdata = (SDL_MouseEventTapData*)driverdata->tapdata;
|
||||
if (tapdata && tapdata->tap)
|
||||
{
|
||||
CGEventTapEnable(tapdata->tap, !!enabled);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -245,6 +262,11 @@ Cocoa_InitMouseEventTap(SDL_MouseData *unused)
|
|||
{
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_EnableMouseEventTap(SDL_MouseData *driverdata, SDL_bool enabled)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_QuitMouseEventTap(SDL_MouseData *driverdata)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -20,8 +20,8 @@
|
|||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoaopengl_h
|
||||
#define _SDL_cocoaopengl_h
|
||||
#ifndef SDL_cocoaopengl_h_
|
||||
#define SDL_cocoaopengl_h_
|
||||
|
||||
#if SDL_VIDEO_OPENGL_CGL
|
||||
|
||||
|
|
@ -58,11 +58,11 @@ extern void Cocoa_GL_GetDrawableSize(_THIS, SDL_Window * window,
|
|||
int * w, int * h);
|
||||
extern int Cocoa_GL_SetSwapInterval(_THIS, int interval);
|
||||
extern int Cocoa_GL_GetSwapInterval(_THIS);
|
||||
extern void Cocoa_GL_SwapWindow(_THIS, SDL_Window * window);
|
||||
extern int Cocoa_GL_SwapWindow(_THIS, SDL_Window * window);
|
||||
extern void Cocoa_GL_DeleteContext(_THIS, SDL_GLContext context);
|
||||
|
||||
#endif /* SDL_VIDEO_OPENGL_CGL */
|
||||
|
||||
#endif /* _SDL_cocoaopengl_h */
|
||||
#endif /* SDL_cocoaopengl_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -25,6 +25,7 @@
|
|||
#if SDL_VIDEO_OPENGL_CGL
|
||||
#include "SDL_cocoavideo.h"
|
||||
#include "SDL_cocoaopengl.h"
|
||||
#include "SDL_cocoaopengles.h"
|
||||
|
||||
#include <OpenGL/CGLTypes.h>
|
||||
#include <OpenGL/OpenGL.h>
|
||||
|
|
@ -165,8 +166,27 @@ Cocoa_GL_CreateContext(_THIS, SDL_Window * window)
|
|||
int glversion_minor;
|
||||
|
||||
if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) {
|
||||
SDL_SetError ("OpenGL ES is not supported on this platform");
|
||||
#if SDL_VIDEO_OPENGL_EGL
|
||||
/* Switch to EGL based functions */
|
||||
Cocoa_GL_UnloadLibrary(_this);
|
||||
_this->GL_LoadLibrary = Cocoa_GLES_LoadLibrary;
|
||||
_this->GL_GetProcAddress = Cocoa_GLES_GetProcAddress;
|
||||
_this->GL_UnloadLibrary = Cocoa_GLES_UnloadLibrary;
|
||||
_this->GL_CreateContext = Cocoa_GLES_CreateContext;
|
||||
_this->GL_MakeCurrent = Cocoa_GLES_MakeCurrent;
|
||||
_this->GL_SetSwapInterval = Cocoa_GLES_SetSwapInterval;
|
||||
_this->GL_GetSwapInterval = Cocoa_GLES_GetSwapInterval;
|
||||
_this->GL_SwapWindow = Cocoa_GLES_SwapWindow;
|
||||
_this->GL_DeleteContext = Cocoa_GLES_DeleteContext;
|
||||
|
||||
if (Cocoa_GLES_LoadLibrary(_this, NULL) != 0) {
|
||||
return NULL;
|
||||
}
|
||||
return Cocoa_GLES_CreateContext(_this, window);
|
||||
#else
|
||||
SDL_SetError("SDL not configured with EGL support");
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
if ((_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_CORE) && !lion_or_later) {
|
||||
SDL_SetError ("OpenGL Core Profile is not supported on this platform version");
|
||||
|
|
@ -383,13 +403,14 @@ Cocoa_GL_GetSwapInterval(_THIS)
|
|||
return status;
|
||||
}}
|
||||
|
||||
void
|
||||
int
|
||||
Cocoa_GL_SwapWindow(_THIS, SDL_Window * window)
|
||||
{ @autoreleasepool
|
||||
{
|
||||
SDLOpenGLContext* nscontext = (SDLOpenGLContext*)SDL_GL_GetCurrentContext();
|
||||
[nscontext flushBuffer];
|
||||
[nscontext updateIfNeeded];
|
||||
return 0;
|
||||
}}
|
||||
|
||||
void
|
||||
|
|
|
|||
49
Engine/lib/sdl/src/video/cocoa/SDL_cocoaopengles.h
Normal file
49
Engine/lib/sdl/src/video/cocoa/SDL_cocoaopengles.h
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef SDL_cocoaopengles_h_
|
||||
#define SDL_cocoaopengles_h_
|
||||
|
||||
#if SDL_VIDEO_OPENGL_EGL
|
||||
|
||||
#include "../SDL_sysvideo.h"
|
||||
#include "../SDL_egl_c.h"
|
||||
|
||||
/* OpenGLES functions */
|
||||
#define Cocoa_GLES_GetAttribute SDL_EGL_GetAttribute
|
||||
#define Cocoa_GLES_GetProcAddress SDL_EGL_GetProcAddress
|
||||
#define Cocoa_GLES_UnloadLibrary SDL_EGL_UnloadLibrary
|
||||
#define Cocoa_GLES_GetSwapInterval SDL_EGL_GetSwapInterval
|
||||
#define Cocoa_GLES_SetSwapInterval SDL_EGL_SetSwapInterval
|
||||
|
||||
extern int Cocoa_GLES_LoadLibrary(_THIS, const char *path);
|
||||
extern SDL_GLContext Cocoa_GLES_CreateContext(_THIS, SDL_Window * window);
|
||||
extern int Cocoa_GLES_SwapWindow(_THIS, SDL_Window * window);
|
||||
extern int Cocoa_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context);
|
||||
extern void Cocoa_GLES_DeleteContext(_THIS, SDL_GLContext context);
|
||||
extern int Cocoa_GLES_SetupWindow(_THIS, SDL_Window * window);
|
||||
|
||||
#endif /* SDL_VIDEO_OPENGL_EGL */
|
||||
|
||||
#endif /* SDL_cocoaopengles_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
132
Engine/lib/sdl/src/video/cocoa/SDL_cocoaopengles.m
Normal file
132
Engine/lib/sdl/src/video/cocoa/SDL_cocoaopengles.m
Normal file
|
|
@ -0,0 +1,132 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_COCOA && SDL_VIDEO_OPENGL_EGL
|
||||
|
||||
#include "SDL_cocoavideo.h"
|
||||
#include "SDL_cocoaopengles.h"
|
||||
#include "SDL_cocoaopengl.h"
|
||||
#include "SDL_log.h"
|
||||
|
||||
/* EGL implementation of SDL OpenGL support */
|
||||
|
||||
int
|
||||
Cocoa_GLES_LoadLibrary(_THIS, const char *path) {
|
||||
|
||||
/* If the profile requested is not GL ES, switch over to WIN_GL functions */
|
||||
if (_this->gl_config.profile_mask != SDL_GL_CONTEXT_PROFILE_ES) {
|
||||
#if SDL_VIDEO_OPENGL_CGL
|
||||
Cocoa_GLES_UnloadLibrary(_this);
|
||||
_this->GL_LoadLibrary = Cocoa_GL_LoadLibrary;
|
||||
_this->GL_GetProcAddress = Cocoa_GL_GetProcAddress;
|
||||
_this->GL_UnloadLibrary = Cocoa_GL_UnloadLibrary;
|
||||
_this->GL_CreateContext = Cocoa_GL_CreateContext;
|
||||
_this->GL_MakeCurrent = Cocoa_GL_MakeCurrent;
|
||||
_this->GL_SetSwapInterval = Cocoa_GL_SetSwapInterval;
|
||||
_this->GL_GetSwapInterval = Cocoa_GL_GetSwapInterval;
|
||||
_this->GL_SwapWindow = Cocoa_GL_SwapWindow;
|
||||
_this->GL_DeleteContext = Cocoa_GL_DeleteContext;
|
||||
return Cocoa_GL_LoadLibrary(_this, path);
|
||||
#else
|
||||
return SDL_SetError("SDL not configured with OpenGL/CGL support");
|
||||
#endif
|
||||
}
|
||||
|
||||
if (_this->egl_data == NULL) {
|
||||
return SDL_EGL_LoadLibrary(_this, NULL, EGL_DEFAULT_DISPLAY, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
SDL_GLContext
|
||||
Cocoa_GLES_CreateContext(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_GLContext context;
|
||||
SDL_WindowData *data = (SDL_WindowData *)window->driverdata;
|
||||
|
||||
#if SDL_VIDEO_OPENGL_CGL
|
||||
if (_this->gl_config.profile_mask != SDL_GL_CONTEXT_PROFILE_ES) {
|
||||
/* Switch to CGL based functions */
|
||||
Cocoa_GLES_UnloadLibrary(_this);
|
||||
_this->GL_LoadLibrary = Cocoa_GL_LoadLibrary;
|
||||
_this->GL_GetProcAddress = Cocoa_GL_GetProcAddress;
|
||||
_this->GL_UnloadLibrary = Cocoa_GL_UnloadLibrary;
|
||||
_this->GL_CreateContext = Cocoa_GL_CreateContext;
|
||||
_this->GL_MakeCurrent = Cocoa_GL_MakeCurrent;
|
||||
_this->GL_SetSwapInterval = Cocoa_GL_SetSwapInterval;
|
||||
_this->GL_GetSwapInterval = Cocoa_GL_GetSwapInterval;
|
||||
_this->GL_SwapWindow = Cocoa_GL_SwapWindow;
|
||||
_this->GL_DeleteContext = Cocoa_GL_DeleteContext;
|
||||
|
||||
if (Cocoa_GL_LoadLibrary(_this, NULL) != 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return Cocoa_GL_CreateContext(_this, window);
|
||||
}
|
||||
#endif
|
||||
|
||||
context = SDL_EGL_CreateContext(_this, data->egl_surface);
|
||||
return context;
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_GLES_DeleteContext(_THIS, SDL_GLContext context)
|
||||
{
|
||||
SDL_EGL_DeleteContext(_this, context);
|
||||
Cocoa_GLES_UnloadLibrary(_this);
|
||||
}
|
||||
|
||||
SDL_EGL_SwapWindow_impl(Cocoa)
|
||||
SDL_EGL_MakeCurrent_impl(Cocoa)
|
||||
|
||||
int
|
||||
Cocoa_GLES_SetupWindow(_THIS, SDL_Window * window)
|
||||
{
|
||||
/* The current context is lost in here; save it and reset it. */
|
||||
SDL_WindowData *windowdata = (SDL_WindowData *) window->driverdata;
|
||||
SDL_Window *current_win = SDL_GL_GetCurrentWindow();
|
||||
SDL_GLContext current_ctx = SDL_GL_GetCurrentContext();
|
||||
|
||||
|
||||
if (_this->egl_data == NULL) {
|
||||
if (SDL_EGL_LoadLibrary(_this, NULL, EGL_DEFAULT_DISPLAY, 0) < 0) {
|
||||
SDL_EGL_UnloadLibrary(_this);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Create the GLES window surface */
|
||||
NSView* v = windowdata->nswindow.contentView;
|
||||
windowdata->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType)[v layer]);
|
||||
|
||||
if (windowdata->egl_surface == EGL_NO_SURFACE) {
|
||||
return SDL_SetError("Could not create GLES window surface");
|
||||
}
|
||||
|
||||
return Cocoa_GLES_MakeCurrent(_this, current_win, current_ctx);
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_COCOA && SDL_VIDEO_OPENGL_EGL */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -21,8 +21,8 @@
|
|||
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoashape_h
|
||||
#define _SDL_cocoashape_h
|
||||
#ifndef SDL_cocoashape_h_
|
||||
#define SDL_cocoashape_h_
|
||||
|
||||
#include "SDL_stdinc.h"
|
||||
#include "SDL_video.h"
|
||||
|
|
@ -40,4 +40,6 @@ extern SDL_WindowShaper* Cocoa_CreateShaper(SDL_Window* window);
|
|||
extern int Cocoa_SetWindowShape(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode);
|
||||
extern int Cocoa_ResizeWindowShape(SDL_Window *window);
|
||||
|
||||
#endif
|
||||
#endif /* SDL_cocoashape_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -35,7 +35,7 @@ Cocoa_CreateShaper(SDL_Window* window)
|
|||
SDL_WindowData* windata = (SDL_WindowData*)window->driverdata;
|
||||
[windata->nswindow setOpaque:NO];
|
||||
|
||||
[windata->nswindow setStyleMask:NSBorderlessWindowMask];
|
||||
[windata->nswindow setStyleMask:NSWindowStyleMaskBorderless];
|
||||
|
||||
SDL_WindowShaper* result = result = malloc(sizeof(SDL_WindowShaper));
|
||||
result->window = window;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -20,8 +20,8 @@
|
|||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoavideo_h
|
||||
#define _SDL_cocoavideo_h
|
||||
#ifndef SDL_cocoavideo_h_
|
||||
#define SDL_cocoavideo_h_
|
||||
|
||||
#include "SDL_opengl.h"
|
||||
|
||||
|
|
@ -40,6 +40,59 @@
|
|||
#include "SDL_cocoaopengl.h"
|
||||
#include "SDL_cocoawindow.h"
|
||||
|
||||
#ifndef MAC_OS_X_VERSION_10_12
|
||||
#define DECLARE_EVENT(name) static const NSEventType NSEventType##name = NS##name
|
||||
DECLARE_EVENT(LeftMouseDown);
|
||||
DECLARE_EVENT(LeftMouseUp);
|
||||
DECLARE_EVENT(RightMouseDown);
|
||||
DECLARE_EVENT(RightMouseUp);
|
||||
DECLARE_EVENT(OtherMouseDown);
|
||||
DECLARE_EVENT(OtherMouseUp);
|
||||
DECLARE_EVENT(MouseMoved);
|
||||
DECLARE_EVENT(LeftMouseDragged);
|
||||
DECLARE_EVENT(RightMouseDragged);
|
||||
DECLARE_EVENT(OtherMouseDragged);
|
||||
DECLARE_EVENT(ScrollWheel);
|
||||
DECLARE_EVENT(KeyDown);
|
||||
DECLARE_EVENT(KeyUp);
|
||||
DECLARE_EVENT(FlagsChanged);
|
||||
#undef DECLARE_EVENT
|
||||
|
||||
static const NSEventMask NSEventMaskAny = NSAnyEventMask;
|
||||
|
||||
#define DECLARE_MODIFIER_FLAG(name) static const NSUInteger NSEventModifierFlag##name = NS##name##KeyMask
|
||||
DECLARE_MODIFIER_FLAG(Shift);
|
||||
DECLARE_MODIFIER_FLAG(Control);
|
||||
DECLARE_MODIFIER_FLAG(Command);
|
||||
DECLARE_MODIFIER_FLAG(NumericPad);
|
||||
DECLARE_MODIFIER_FLAG(Help);
|
||||
DECLARE_MODIFIER_FLAG(Function);
|
||||
#undef DECLARE_MODIFIER_FLAG
|
||||
static const NSUInteger NSEventModifierFlagCapsLock = NSAlphaShiftKeyMask;
|
||||
static const NSUInteger NSEventModifierFlagOption = NSAlternateKeyMask;
|
||||
|
||||
#define DECLARE_WINDOW_MASK(name) static const unsigned int NSWindowStyleMask##name = NS##name##WindowMask
|
||||
DECLARE_WINDOW_MASK(Borderless);
|
||||
DECLARE_WINDOW_MASK(Titled);
|
||||
DECLARE_WINDOW_MASK(Closable);
|
||||
DECLARE_WINDOW_MASK(Miniaturizable);
|
||||
DECLARE_WINDOW_MASK(Resizable);
|
||||
DECLARE_WINDOW_MASK(TexturedBackground);
|
||||
DECLARE_WINDOW_MASK(UnifiedTitleAndToolbar);
|
||||
DECLARE_WINDOW_MASK(FullScreen);
|
||||
/*DECLARE_WINDOW_MASK(FullSizeContentView);*/ /* Not used, fails compile on older SDKs */
|
||||
static const unsigned int NSWindowStyleMaskUtilityWindow = NSUtilityWindowMask;
|
||||
static const unsigned int NSWindowStyleMaskDocModalWindow = NSDocModalWindowMask;
|
||||
static const unsigned int NSWindowStyleMaskHUDWindow = NSHUDWindowMask;
|
||||
#undef DECLARE_WINDOW_MASK
|
||||
|
||||
#define DECLARE_ALERT_STYLE(name) static const NSUInteger NSAlertStyle##name = NS##name##AlertStyle
|
||||
DECLARE_ALERT_STYLE(Warning);
|
||||
DECLARE_ALERT_STYLE(Informational);
|
||||
DECLARE_ALERT_STYLE(Critical);
|
||||
#undef DECLARE_ALERT_STYLE
|
||||
#endif
|
||||
|
||||
/* Private display data */
|
||||
|
||||
@class SDLTranslatorResponder;
|
||||
|
|
@ -60,6 +113,6 @@ typedef struct SDL_VideoData
|
|||
/* Utility functions */
|
||||
extern NSImage * Cocoa_CreateImage(SDL_Surface * surface);
|
||||
|
||||
#endif /* _SDL_cocoavideo_h */
|
||||
#endif /* SDL_cocoavideo_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -26,6 +26,7 @@
|
|||
#include "SDL_endian.h"
|
||||
#include "SDL_cocoavideo.h"
|
||||
#include "SDL_cocoashape.h"
|
||||
#include "SDL_cocoavulkan.h"
|
||||
#include "SDL_assert.h"
|
||||
|
||||
/* Initialization/Query functions */
|
||||
|
|
@ -80,8 +81,8 @@ Cocoa_CreateDevice(int devindex)
|
|||
device->PumpEvents = Cocoa_PumpEvents;
|
||||
device->SuspendScreenSaver = Cocoa_SuspendScreenSaver;
|
||||
|
||||
device->CreateWindow = Cocoa_CreateWindow;
|
||||
device->CreateWindowFrom = Cocoa_CreateWindowFrom;
|
||||
device->CreateSDLWindow = Cocoa_CreateWindow;
|
||||
device->CreateSDLWindowFrom = Cocoa_CreateWindowFrom;
|
||||
device->SetWindowTitle = Cocoa_SetWindowTitle;
|
||||
device->SetWindowIcon = Cocoa_SetWindowIcon;
|
||||
device->SetWindowPosition = Cocoa_SetWindowPosition;
|
||||
|
|
@ -120,6 +121,24 @@ Cocoa_CreateDevice(int devindex)
|
|||
device->GL_GetSwapInterval = Cocoa_GL_GetSwapInterval;
|
||||
device->GL_SwapWindow = Cocoa_GL_SwapWindow;
|
||||
device->GL_DeleteContext = Cocoa_GL_DeleteContext;
|
||||
#elif SDL_VIDEO_OPENGL_EGL
|
||||
device->GL_LoadLibrary = Cocoa_GLES_LoadLibrary;
|
||||
device->GL_GetProcAddress = Cocoa_GLES_GetProcAddress;
|
||||
device->GL_UnloadLibrary = Cocoa_GLES_UnloadLibrary;
|
||||
device->GL_CreateContext = Cocoa_GLES_CreateContext;
|
||||
device->GL_MakeCurrent = Cocoa_GLES_MakeCurrent;
|
||||
device->GL_SetSwapInterval = Cocoa_GLES_SetSwapInterval;
|
||||
device->GL_GetSwapInterval = Cocoa_GLES_GetSwapInterval;
|
||||
device->GL_SwapWindow = Cocoa_GLES_SwapWindow;
|
||||
device->GL_DeleteContext = Cocoa_GLES_DeleteContext;
|
||||
#endif
|
||||
|
||||
#if SDL_VIDEO_VULKAN
|
||||
device->Vulkan_LoadLibrary = Cocoa_Vulkan_LoadLibrary;
|
||||
device->Vulkan_UnloadLibrary = Cocoa_Vulkan_UnloadLibrary;
|
||||
device->Vulkan_GetInstanceExtensions = Cocoa_Vulkan_GetInstanceExtensions;
|
||||
device->Vulkan_CreateSurface = Cocoa_Vulkan_CreateSurface;
|
||||
device->Vulkan_GetDrawableSize = Cocoa_Vulkan_GetDrawableSize;
|
||||
#endif
|
||||
|
||||
device->StartTextInput = Cocoa_StartTextInput;
|
||||
|
|
|
|||
55
Engine/lib/sdl/src/video/cocoa/SDL_cocoavulkan.h
Normal file
55
Engine/lib/sdl/src/video/cocoa/SDL_cocoavulkan.h
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @author Mark Callow, www.edgewise-consulting.com. Based on Jacob Lifshay's
|
||||
* SDL_x11vulkan.h.
|
||||
*/
|
||||
|
||||
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef SDL_cocoavulkan_h_
|
||||
#define SDL_cocoavulkan_h_
|
||||
|
||||
#include "../SDL_vulkan_internal.h"
|
||||
#include "../SDL_sysvideo.h"
|
||||
|
||||
#if SDL_VIDEO_VULKAN && SDL_VIDEO_DRIVER_COCOA
|
||||
|
||||
int Cocoa_Vulkan_LoadLibrary(_THIS, const char *path);
|
||||
void Cocoa_Vulkan_UnloadLibrary(_THIS);
|
||||
SDL_bool Cocoa_Vulkan_GetInstanceExtensions(_THIS,
|
||||
SDL_Window *window,
|
||||
unsigned *count,
|
||||
const char **names);
|
||||
SDL_bool Cocoa_Vulkan_CreateSurface(_THIS,
|
||||
SDL_Window *window,
|
||||
VkInstance instance,
|
||||
VkSurfaceKHR *surface);
|
||||
|
||||
void Cocoa_Vulkan_GetDrawableSize(_THIS, SDL_Window *window, int *w, int *h);
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* SDL_cocoavulkan_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
231
Engine/lib/sdl/src/video/cocoa/SDL_cocoavulkan.m
Normal file
231
Engine/lib/sdl/src/video/cocoa/SDL_cocoavulkan.m
Normal file
|
|
@ -0,0 +1,231 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @author Mark Callow, www.edgewise-consulting.com. Based on Jacob Lifshay's
|
||||
* SDL_x11vulkan.c.
|
||||
*/
|
||||
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_VULKAN && SDL_VIDEO_DRIVER_COCOA
|
||||
|
||||
#include "SDL_cocoavideo.h"
|
||||
#include "SDL_cocoawindow.h"
|
||||
#include "SDL_assert.h"
|
||||
|
||||
#include "SDL_loadso.h"
|
||||
#include "SDL_cocoametalview.h"
|
||||
#include "SDL_cocoavulkan.h"
|
||||
#include "SDL_syswm.h"
|
||||
|
||||
#include <dlfcn.h>
|
||||
|
||||
const char* defaultPaths[] = {
|
||||
"vulkan.framework/vulkan",
|
||||
"libvulkan.1.dylib",
|
||||
"MoltenVK.framework/MoltenVK",
|
||||
"libMoltenVK.dylib"
|
||||
};
|
||||
|
||||
/* Since libSDL is most likely a .dylib, need RTLD_DEFAULT not RTLD_SELF. */
|
||||
#define DEFAULT_HANDLE RTLD_DEFAULT
|
||||
|
||||
int Cocoa_Vulkan_LoadLibrary(_THIS, const char *path)
|
||||
{
|
||||
VkExtensionProperties *extensions = NULL;
|
||||
Uint32 extensionCount = 0;
|
||||
SDL_bool hasSurfaceExtension = SDL_FALSE;
|
||||
SDL_bool hasMacOSSurfaceExtension = SDL_FALSE;
|
||||
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = NULL;
|
||||
|
||||
if (_this->vulkan_config.loader_handle) {
|
||||
SDL_SetError("Vulkan/MoltenVK already loaded");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Load the Vulkan loader library */
|
||||
if (!path) {
|
||||
path = SDL_getenv("SDL_VULKAN_LIBRARY");
|
||||
}
|
||||
|
||||
if (!path) {
|
||||
/* MoltenVK framework, currently, v0.17.0, has a static library and is
|
||||
* the recommended way to use the package. There is likely no object to
|
||||
* load. */
|
||||
vkGetInstanceProcAddr =
|
||||
(PFN_vkGetInstanceProcAddr)dlsym(DEFAULT_HANDLE,
|
||||
"vkGetInstanceProcAddr");
|
||||
}
|
||||
|
||||
if (vkGetInstanceProcAddr) {
|
||||
_this->vulkan_config.loader_handle = DEFAULT_HANDLE;
|
||||
} else {
|
||||
const char** paths;
|
||||
int numPaths;
|
||||
int i;
|
||||
|
||||
if (path) {
|
||||
paths = &path;
|
||||
numPaths = 1;
|
||||
} else {
|
||||
/* Look for framework or .dylib packaged with the application
|
||||
* instead. */
|
||||
paths = defaultPaths;
|
||||
numPaths = SDL_arraysize(defaultPaths);
|
||||
}
|
||||
|
||||
for (i=0; i < numPaths; i++) {
|
||||
_this->vulkan_config.loader_handle = SDL_LoadObject(paths[i]);
|
||||
if (_this->vulkan_config.loader_handle)
|
||||
break;
|
||||
else
|
||||
continue;
|
||||
}
|
||||
if (i == numPaths)
|
||||
return -1;
|
||||
|
||||
SDL_strlcpy(_this->vulkan_config.loader_path, paths[i],
|
||||
SDL_arraysize(_this->vulkan_config.loader_path));
|
||||
vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)SDL_LoadFunction(
|
||||
_this->vulkan_config.loader_handle, "vkGetInstanceProcAddr");
|
||||
}
|
||||
|
||||
if (!vkGetInstanceProcAddr) {
|
||||
SDL_SetError("Failed to find %s in either executable or %s: %s",
|
||||
"vkGetInstanceProcAddr",
|
||||
_this->vulkan_config.loader_path,
|
||||
(const char *) dlerror());
|
||||
goto fail;
|
||||
}
|
||||
|
||||
_this->vulkan_config.vkGetInstanceProcAddr = (void *)vkGetInstanceProcAddr;
|
||||
_this->vulkan_config.vkEnumerateInstanceExtensionProperties =
|
||||
(void *)((PFN_vkGetInstanceProcAddr)_this->vulkan_config.vkGetInstanceProcAddr)(
|
||||
VK_NULL_HANDLE, "vkEnumerateInstanceExtensionProperties");
|
||||
if (!_this->vulkan_config.vkEnumerateInstanceExtensionProperties) {
|
||||
goto fail;
|
||||
}
|
||||
extensions = SDL_Vulkan_CreateInstanceExtensionsList(
|
||||
(PFN_vkEnumerateInstanceExtensionProperties)
|
||||
_this->vulkan_config.vkEnumerateInstanceExtensionProperties,
|
||||
&extensionCount);
|
||||
if (!extensions) {
|
||||
goto fail;
|
||||
}
|
||||
for (Uint32 i = 0; i < extensionCount; i++) {
|
||||
if (SDL_strcmp(VK_KHR_SURFACE_EXTENSION_NAME, extensions[i].extensionName) == 0) {
|
||||
hasSurfaceExtension = SDL_TRUE;
|
||||
} else if (SDL_strcmp(VK_MVK_MACOS_SURFACE_EXTENSION_NAME, extensions[i].extensionName) == 0) {
|
||||
hasMacOSSurfaceExtension = SDL_TRUE;
|
||||
}
|
||||
}
|
||||
SDL_free(extensions);
|
||||
if (!hasSurfaceExtension) {
|
||||
SDL_SetError("Installed MoltenVK/Vulkan doesn't implement the "
|
||||
VK_KHR_SURFACE_EXTENSION_NAME " extension");
|
||||
goto fail;
|
||||
} else if (!hasMacOSSurfaceExtension) {
|
||||
SDL_SetError("Installed MoltenVK/Vulkan doesn't implement the "
|
||||
VK_MVK_MACOS_SURFACE_EXTENSION_NAME "extension");
|
||||
goto fail;
|
||||
}
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
SDL_UnloadObject(_this->vulkan_config.loader_handle);
|
||||
_this->vulkan_config.loader_handle = NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
void Cocoa_Vulkan_UnloadLibrary(_THIS)
|
||||
{
|
||||
if (_this->vulkan_config.loader_handle) {
|
||||
if (_this->vulkan_config.loader_handle != DEFAULT_HANDLE) {
|
||||
SDL_UnloadObject(_this->vulkan_config.loader_handle);
|
||||
}
|
||||
_this->vulkan_config.loader_handle = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
SDL_bool Cocoa_Vulkan_GetInstanceExtensions(_THIS,
|
||||
SDL_Window *window,
|
||||
unsigned *count,
|
||||
const char **names)
|
||||
{
|
||||
static const char *const extensionsForCocoa[] = {
|
||||
VK_KHR_SURFACE_EXTENSION_NAME, VK_MVK_MACOS_SURFACE_EXTENSION_NAME
|
||||
};
|
||||
if (!_this->vulkan_config.loader_handle) {
|
||||
SDL_SetError("Vulkan is not loaded");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
return SDL_Vulkan_GetInstanceExtensions_Helper(
|
||||
count, names, SDL_arraysize(extensionsForCocoa),
|
||||
extensionsForCocoa);
|
||||
}
|
||||
|
||||
SDL_bool Cocoa_Vulkan_CreateSurface(_THIS,
|
||||
SDL_Window *window,
|
||||
VkInstance instance,
|
||||
VkSurfaceKHR *surface)
|
||||
{
|
||||
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr =
|
||||
(PFN_vkGetInstanceProcAddr)_this->vulkan_config.vkGetInstanceProcAddr;
|
||||
PFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK =
|
||||
(PFN_vkCreateMacOSSurfaceMVK)vkGetInstanceProcAddr(
|
||||
(VkInstance)instance,
|
||||
"vkCreateMacOSSurfaceMVK");
|
||||
VkMacOSSurfaceCreateInfoMVK createInfo = {};
|
||||
VkResult result;
|
||||
|
||||
if (!_this->vulkan_config.loader_handle) {
|
||||
SDL_SetError("Vulkan is not loaded");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (!vkCreateMacOSSurfaceMVK) {
|
||||
SDL_SetError(VK_MVK_MACOS_SURFACE_EXTENSION_NAME
|
||||
" extension is not enabled in the Vulkan instance.");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
createInfo.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK;
|
||||
createInfo.pNext = NULL;
|
||||
createInfo.flags = 0;
|
||||
createInfo.pView = Cocoa_Mtl_AddMetalView(window);
|
||||
result = vkCreateMacOSSurfaceMVK(instance, &createInfo,
|
||||
NULL, surface);
|
||||
if (result != VK_SUCCESS) {
|
||||
SDL_SetError("vkCreateMacOSSurfaceMVK failed: %s",
|
||||
SDL_Vulkan_GetResultString(result));
|
||||
return SDL_FALSE;
|
||||
}
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
void Cocoa_Vulkan_GetDrawableSize(_THIS, SDL_Window *window, int *w, int *h)
|
||||
{
|
||||
Cocoa_Mtl_GetDrawableSize(window, w, h);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* vim: set ts=4 sw=4 expandtab: */
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -20,11 +20,15 @@
|
|||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoawindow_h
|
||||
#define _SDL_cocoawindow_h
|
||||
#ifndef SDL_cocoawindow_h_
|
||||
#define SDL_cocoawindow_h_
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
#if SDL_VIDEO_OPENGL_EGL
|
||||
#include "../SDL_egl_c.h"
|
||||
#endif
|
||||
|
||||
typedef struct SDL_WindowData SDL_WindowData;
|
||||
|
||||
typedef enum
|
||||
|
|
@ -114,6 +118,9 @@ struct SDL_WindowData
|
|||
SDL_bool inWindowMove;
|
||||
Cocoa_WindowListener *listener;
|
||||
struct SDL_VideoData *videodata;
|
||||
#if SDL_VIDEO_OPENGL_EGL
|
||||
EGLSurface egl_surface;
|
||||
#endif
|
||||
};
|
||||
|
||||
extern int Cocoa_CreateWindow(_THIS, SDL_Window * window);
|
||||
|
|
@ -142,6 +149,6 @@ extern void Cocoa_DestroyWindow(_THIS, SDL_Window * window);
|
|||
extern SDL_bool Cocoa_GetWindowWMInfo(_THIS, SDL_Window * window, struct SDL_SysWMinfo *info);
|
||||
extern int Cocoa_SetWindowHitTest(SDL_Window *window, SDL_bool enabled);
|
||||
|
||||
#endif /* _SDL_cocoawindow_h */
|
||||
#endif /* SDL_cocoawindow_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -38,7 +38,9 @@
|
|||
#include "SDL_cocoavideo.h"
|
||||
#include "SDL_cocoashape.h"
|
||||
#include "SDL_cocoamouse.h"
|
||||
#include "SDL_cocoamousetap.h"
|
||||
#include "SDL_cocoaopengl.h"
|
||||
#include "SDL_cocoaopengles.h"
|
||||
#include "SDL_assert.h"
|
||||
|
||||
/* #define DEBUG_COCOAWINDOW */
|
||||
|
|
@ -64,10 +66,31 @@
|
|||
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender;
|
||||
- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender;
|
||||
- (BOOL)wantsPeriodicDraggingUpdates;
|
||||
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem;
|
||||
|
||||
- (SDL_Window*)findSDLWindow;
|
||||
@end
|
||||
|
||||
@implementation SDLWindow
|
||||
|
||||
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
|
||||
{
|
||||
/* Only allow using the macOS native fullscreen toggle menubar item if the
|
||||
* window is resizable and not in a SDL fullscreen mode.
|
||||
*/
|
||||
if ([menuItem action] == @selector(toggleFullScreen:)) {
|
||||
SDL_Window *window = [self findSDLWindow];
|
||||
if (window == NULL) {
|
||||
return NO;
|
||||
} else if ((window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_FULLSCREEN_DESKTOP)) != 0) {
|
||||
return NO;
|
||||
} else if ((window->flags & SDL_WINDOW_RESIZABLE) == 0) {
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
return [super validateMenuItem:menuItem];
|
||||
}
|
||||
|
||||
- (BOOL)canBecomeKeyWindow
|
||||
{
|
||||
return YES;
|
||||
|
|
@ -82,7 +105,7 @@
|
|||
{
|
||||
[super sendEvent:event];
|
||||
|
||||
if ([event type] != NSLeftMouseUp) {
|
||||
if ([event type] != NSEventTypeLeftMouseUp) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -116,11 +139,10 @@
|
|||
- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
|
||||
{ @autoreleasepool
|
||||
{
|
||||
SDL_VideoDevice *_this = SDL_GetVideoDevice();
|
||||
NSPasteboard *pasteboard = [sender draggingPasteboard];
|
||||
NSArray *types = [NSArray arrayWithObject:NSFilenamesPboardType];
|
||||
NSString *desiredType = [pasteboard availableTypeFromArray:types];
|
||||
SDL_Window *sdlwindow = nil;
|
||||
SDL_Window *sdlwindow = [self findSDLWindow];
|
||||
|
||||
if (desiredType == nil) {
|
||||
return NO; /* can't accept anything that's being dropped here. */
|
||||
|
|
@ -157,16 +179,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
/* !!! FIXME: is there a better way to do this? */
|
||||
if (_this) {
|
||||
for (sdlwindow = _this->windows; sdlwindow; sdlwindow = sdlwindow->next) {
|
||||
NSWindow *nswindow = ((SDL_WindowData *) sdlwindow->driverdata)->nswindow;
|
||||
if (nswindow == self) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!SDL_SendDropFile(sdlwindow, [[fileURL path] UTF8String])) {
|
||||
return NO;
|
||||
}
|
||||
|
|
@ -181,6 +193,24 @@
|
|||
return NO;
|
||||
}
|
||||
|
||||
- (SDL_Window*)findSDLWindow
|
||||
{
|
||||
SDL_Window *sdlwindow = NULL;
|
||||
SDL_VideoDevice *_this = SDL_GetVideoDevice();
|
||||
|
||||
/* !!! FIXME: is there a better way to do this? */
|
||||
if (_this) {
|
||||
for (sdlwindow = _this->windows; sdlwindow; sdlwindow = sdlwindow->next) {
|
||||
NSWindow *nswindow = ((SDL_WindowData *) sdlwindow->driverdata)->nswindow;
|
||||
if (nswindow == self) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return sdlwindow;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
|
@ -220,15 +250,15 @@ GetWindowStyle(SDL_Window * window)
|
|||
NSUInteger style = 0;
|
||||
|
||||
if (window->flags & SDL_WINDOW_FULLSCREEN) {
|
||||
style = NSBorderlessWindowMask;
|
||||
style = NSWindowStyleMaskBorderless;
|
||||
} else {
|
||||
if (window->flags & SDL_WINDOW_BORDERLESS) {
|
||||
style = NSBorderlessWindowMask;
|
||||
style = NSWindowStyleMaskBorderless;
|
||||
} else {
|
||||
style = (NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask);
|
||||
style = (NSWindowStyleMaskTitled|NSWindowStyleMaskClosable|NSWindowStyleMaskMiniaturizable);
|
||||
}
|
||||
if (window->flags & SDL_WINDOW_RESIZABLE) {
|
||||
style |= NSResizableWindowMask;
|
||||
style |= NSWindowStyleMaskResizable;
|
||||
}
|
||||
}
|
||||
return style;
|
||||
|
|
@ -491,6 +521,11 @@ SetWindowStyle(SDL_Window * window, NSUInteger style)
|
|||
NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]];
|
||||
ConvertNSRect([nswindow screen], fullscreen, &rect);
|
||||
|
||||
if (inFullscreenTransition) {
|
||||
/* We'll take care of this at the end of the transition */
|
||||
return;
|
||||
}
|
||||
|
||||
if (s_moveHack) {
|
||||
SDL_bool blockMove = ((SDL_GetTicks() - s_moveHack) < 500);
|
||||
|
||||
|
|
@ -594,8 +629,8 @@ SetWindowStyle(SDL_Window * window, NSUInteger style)
|
|||
[NSMenu setMenuBarVisible:NO];
|
||||
}
|
||||
|
||||
const unsigned int newflags = [NSEvent modifierFlags] & NSAlphaShiftKeyMask;
|
||||
_data->videodata->modifierFlags = (_data->videodata->modifierFlags & ~NSAlphaShiftKeyMask) | newflags;
|
||||
const unsigned int newflags = [NSEvent modifierFlags] & NSEventModifierFlagCapsLock;
|
||||
_data->videodata->modifierFlags = (_data->videodata->modifierFlags & ~NSEventModifierFlagCapsLock) | newflags;
|
||||
SDL_ToggleModState(KMOD_CAPS, newflags != 0);
|
||||
}
|
||||
|
||||
|
|
@ -641,7 +676,7 @@ SetWindowStyle(SDL_Window * window, NSUInteger style)
|
|||
{
|
||||
SDL_Window *window = _data->window;
|
||||
|
||||
SetWindowStyle(window, (NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask));
|
||||
SetWindowStyle(window, (NSWindowStyleMaskTitled|NSWindowStyleMaskClosable|NSWindowStyleMaskMiniaturizable|NSWindowStyleMaskResizable));
|
||||
|
||||
isFullscreenSpace = YES;
|
||||
inFullscreenTransition = YES;
|
||||
|
|
@ -666,6 +701,8 @@ SetWindowStyle(SDL_Window * window, NSUInteger style)
|
|||
- (void)windowDidEnterFullScreen:(NSNotification *)aNotification
|
||||
{
|
||||
SDL_Window *window = _data->window;
|
||||
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
||||
NSWindow *nswindow = data->nswindow;
|
||||
|
||||
inFullscreenTransition = NO;
|
||||
|
||||
|
|
@ -673,6 +710,11 @@ SetWindowStyle(SDL_Window * window, NSUInteger style)
|
|||
pendingWindowOperation = PENDING_OPERATION_NONE;
|
||||
[self setFullscreenSpace:NO];
|
||||
} else {
|
||||
/* Unset the resizable flag.
|
||||
This is a workaround for https://bugzilla.libsdl.org/show_bug.cgi?id=3697
|
||||
*/
|
||||
SetWindowStyle(window, [nswindow styleMask] & (~NSWindowStyleMaskResizable));
|
||||
|
||||
if ((window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP) {
|
||||
[NSMenu setMenuBarVisible:NO];
|
||||
}
|
||||
|
|
@ -683,6 +725,7 @@ SetWindowStyle(SDL_Window * window, NSUInteger style)
|
|||
*/
|
||||
window->w = 0;
|
||||
window->h = 0;
|
||||
[self windowDidMove:aNotification];
|
||||
[self windowDidResize:aNotification];
|
||||
}
|
||||
}
|
||||
|
|
@ -691,13 +734,13 @@ SetWindowStyle(SDL_Window * window, NSUInteger style)
|
|||
{
|
||||
SDL_Window *window = _data->window;
|
||||
|
||||
isFullscreenSpace = NO;
|
||||
inFullscreenTransition = YES;
|
||||
|
||||
/* As of OS X 10.11, the window seems to need to be resizable when exiting
|
||||
a Space, in order for it to resize back to its windowed-mode size.
|
||||
*/
|
||||
SetWindowStyle(window, GetWindowStyle(window) | NSResizableWindowMask);
|
||||
|
||||
isFullscreenSpace = NO;
|
||||
inFullscreenTransition = YES;
|
||||
SetWindowStyle(window, GetWindowStyle(window) | NSWindowStyleMaskResizable);
|
||||
}
|
||||
|
||||
- (void)windowDidFailToExitFullScreen:(NSNotification *)aNotification
|
||||
|
|
@ -708,7 +751,7 @@ SetWindowStyle(SDL_Window * window, NSUInteger style)
|
|||
return;
|
||||
}
|
||||
|
||||
SetWindowStyle(window, (NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask));
|
||||
SetWindowStyle(window, (NSWindowStyleMaskTitled|NSWindowStyleMaskClosable|NSWindowStyleMaskMiniaturizable|NSWindowStyleMaskResizable));
|
||||
|
||||
isFullscreenSpace = YES;
|
||||
inFullscreenTransition = NO;
|
||||
|
|
@ -744,11 +787,36 @@ SetWindowStyle(SDL_Window * window, NSUInteger style)
|
|||
[NSMenu setMenuBarVisible:YES];
|
||||
|
||||
pendingWindowOperation = PENDING_OPERATION_NONE;
|
||||
|
||||
#if 0
|
||||
/* This fixed bug 3719, which is that changing window size while fullscreen
|
||||
doesn't take effect when leaving fullscreen, but introduces bug 3809,
|
||||
which is that a maximized window doesn't go back to normal size when
|
||||
restored, so this code is disabled until we can properly handle the
|
||||
beginning and end of maximize and restore.
|
||||
*/
|
||||
/* Restore windowed size and position in case it changed while fullscreen */
|
||||
{
|
||||
NSRect rect;
|
||||
rect.origin.x = window->windowed.x;
|
||||
rect.origin.y = window->windowed.y;
|
||||
rect.size.width = window->windowed.w;
|
||||
rect.size.height = window->windowed.h;
|
||||
ConvertNSRect([nswindow screen], NO, &rect);
|
||||
|
||||
s_moveHack = 0;
|
||||
[nswindow setContentSize:rect.size];
|
||||
[nswindow setFrameOrigin:rect.origin];
|
||||
s_moveHack = SDL_GetTicks();
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
/* Force the size change event in case it was delivered earlier
|
||||
while the window was still animating into place.
|
||||
*/
|
||||
window->w = 0;
|
||||
window->h = 0;
|
||||
[self windowDidMove:aNotification];
|
||||
[self windowDidResize:aNotification];
|
||||
|
||||
/* FIXME: Why does the window get hidden? */
|
||||
|
|
@ -839,7 +907,7 @@ SetWindowStyle(SDL_Window * window, NSUInteger style)
|
|||
|
||||
switch ([theEvent buttonNumber]) {
|
||||
case 0:
|
||||
if (([theEvent modifierFlags] & NSControlKeyMask) &&
|
||||
if (([theEvent modifierFlags] & NSEventModifierFlagControl) &&
|
||||
GetHintCtrlClickEmulateRightClick()) {
|
||||
wasCtrlLeft = YES;
|
||||
button = SDL_BUTTON_RIGHT;
|
||||
|
|
@ -1085,6 +1153,11 @@ SetWindowStyle(SDL_Window * window, NSUInteger style)
|
|||
|
||||
- (void)drawRect:(NSRect)dirtyRect
|
||||
{
|
||||
/* Force the graphics context to clear to black so we don't get a flash of
|
||||
white until the app is ready to draw. In practice on modern macOS, this
|
||||
only gets called for window creation and other extraordinary events. */
|
||||
[[NSColor blackColor] setFill];
|
||||
NSRectFill(dirtyRect);
|
||||
SDL_SendWindowEvent(_sdlWindow, SDL_WINDOWEVENT_EXPOSED, 0, 0);
|
||||
}
|
||||
|
||||
|
|
@ -1168,12 +1241,12 @@ SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created
|
|||
{
|
||||
unsigned long style = [nswindow styleMask];
|
||||
|
||||
if (style == NSBorderlessWindowMask) {
|
||||
if (style == NSWindowStyleMaskBorderless) {
|
||||
window->flags |= SDL_WINDOW_BORDERLESS;
|
||||
} else {
|
||||
window->flags &= ~SDL_WINDOW_BORDERLESS;
|
||||
}
|
||||
if (style & NSResizableWindowMask) {
|
||||
if (style & NSWindowStyleMaskResizable) {
|
||||
window->flags |= SDL_WINDOW_RESIZABLE;
|
||||
} else {
|
||||
window->flags &= ~SDL_WINDOW_RESIZABLE;
|
||||
|
|
@ -1249,7 +1322,6 @@ Cocoa_CreateWindow(_THIS, SDL_Window * window)
|
|||
@catch (NSException *e) {
|
||||
return SDL_SetError("%s", [[e reason] UTF8String]);
|
||||
}
|
||||
[nswindow setBackgroundColor:[NSColor blackColor]];
|
||||
|
||||
if (videodata->allow_spaces) {
|
||||
SDL_assert(floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6);
|
||||
|
|
@ -1271,7 +1343,14 @@ Cocoa_CreateWindow(_THIS, SDL_Window * window)
|
|||
[contentView setWantsBestResolutionOpenGLSurface:YES];
|
||||
}
|
||||
}
|
||||
|
||||
#if SDL_VIDEO_OPENGL_ES2
|
||||
#if SDL_VIDEO_OPENGL_EGL
|
||||
if ((window->flags & SDL_WINDOW_OPENGL) &&
|
||||
_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) {
|
||||
[contentView setWantsLayer:TRUE];
|
||||
}
|
||||
#endif /* SDL_VIDEO_OPENGL_EGL */
|
||||
#endif /* SDL_VIDEO_OPENGL_ES2 */
|
||||
[nswindow setContentView:contentView];
|
||||
[contentView release];
|
||||
|
||||
|
|
@ -1282,6 +1361,25 @@ Cocoa_CreateWindow(_THIS, SDL_Window * window)
|
|||
[nswindow release];
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!(window->flags & SDL_WINDOW_OPENGL)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* The rest of this macro mess is for OpenGL or OpenGL ES windows */
|
||||
#if SDL_VIDEO_OPENGL_ES2
|
||||
if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) {
|
||||
#if SDL_VIDEO_OPENGL_EGL
|
||||
if (Cocoa_GLES_SetupWindow(_this, window) < 0) {
|
||||
Cocoa_DestroyWindow(_this, window);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
#else
|
||||
return SDL_SetError("Could not create GLES window surface (EGL support not configured)");
|
||||
#endif /* SDL_VIDEO_OPENGL_EGL */
|
||||
}
|
||||
#endif /* SDL_VIDEO_OPENGL_ES2 */
|
||||
return 0;
|
||||
}}
|
||||
|
||||
|
|
@ -1534,7 +1632,7 @@ Cocoa_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display
|
|||
rect.origin.y += (screenRect.size.height - rect.size.height);
|
||||
}
|
||||
|
||||
[nswindow setStyleMask:NSBorderlessWindowMask];
|
||||
[nswindow setStyleMask:NSWindowStyleMaskBorderless];
|
||||
} else {
|
||||
rect.origin.x = window->windowed.x;
|
||||
rect.origin.y = window->windowed.y;
|
||||
|
|
@ -1634,8 +1732,13 @@ Cocoa_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp)
|
|||
void
|
||||
Cocoa_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed)
|
||||
{
|
||||
/* Move the cursor to the nearest point in the window */
|
||||
SDL_Mouse *mouse = SDL_GetMouse();
|
||||
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
||||
|
||||
/* Enable or disable the event tap as necessary */
|
||||
Cocoa_EnableMouseEventTap(mouse->driverdata, grabbed);
|
||||
|
||||
/* Move the cursor to the nearest point in the window */
|
||||
if (grabbed && data && ![data->listener isMoving]) {
|
||||
int x, y;
|
||||
CGPoint cgpoint;
|
||||
|
|
@ -1700,7 +1803,7 @@ Cocoa_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info)
|
|||
info->info.cocoa.window = nswindow;
|
||||
return SDL_TRUE;
|
||||
} else {
|
||||
SDL_SetError("Application not compiled with SDL %d.%d\n",
|
||||
SDL_SetError("Application not compiled with SDL %d.%d",
|
||||
SDL_MAJOR_VERSION, SDL_MINOR_VERSION);
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -19,8 +19,8 @@
|
|||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef _SDL_directfb_wm_h
|
||||
#define _SDL_directfb_wm_h
|
||||
#ifndef SDL_directfb_wm_h_
|
||||
#define SDL_directfb_wm_h_
|
||||
|
||||
#include "SDL_DirectFB_video.h"
|
||||
|
||||
|
|
@ -51,6 +51,6 @@ extern DFBResult DirectFB_WM_GetClientSize(_THIS, SDL_Window * window,
|
|||
int *cw, int *ch);
|
||||
|
||||
|
||||
#endif /* _SDL_directfb_wm_h */
|
||||
#endif /* SDL_directfb_wm_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -19,8 +19,8 @@
|
|||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef _SDL_DirectFB_dyn_h
|
||||
#define _SDL_DirectFB_dyn_h
|
||||
#ifndef SDL_DirectFB_dyn_h_
|
||||
#define SDL_DirectFB_dyn_h_
|
||||
|
||||
#define DFB_SYMS \
|
||||
DFB_SYM(DFBResult, DirectFBError, (const char *msg, DFBResult result), (msg, result), return) \
|
||||
|
|
@ -36,4 +36,6 @@
|
|||
int SDL_DirectFB_LoadLibrary(void);
|
||||
void SDL_DirectFB_UnLoadLibrary(void);
|
||||
|
||||
#endif
|
||||
#endif /* SDL_DirectFB_dyn_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -743,9 +743,6 @@ void
|
|||
DirectFB_QuitKeyboard(_THIS)
|
||||
{
|
||||
/* SDL_DFB_DEVICEDATA(_this); */
|
||||
|
||||
SDL_KeyboardQuit();
|
||||
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_DIRECTFB */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -19,8 +19,8 @@
|
|||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef _SDL_DirectFB_events_h
|
||||
#define _SDL_DirectFB_events_h
|
||||
#ifndef SDL_DirectFB_events_h_
|
||||
#define SDL_DirectFB_events_h_
|
||||
|
||||
#include "../SDL_sysvideo.h"
|
||||
|
||||
|
|
@ -29,4 +29,6 @@ extern void DirectFB_InitKeyboard(_THIS);
|
|||
extern void DirectFB_QuitKeyboard(_THIS);
|
||||
extern void DirectFB_PumpEventsWindow(_THIS);
|
||||
|
||||
#endif
|
||||
#endif /* SDL_DirectFB_events_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -19,8 +19,8 @@
|
|||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef _SDL_directfb_modes_h
|
||||
#define _SDL_directfb_modes_h
|
||||
#ifndef SDL_directfb_modes_h_
|
||||
#define SDL_directfb_modes_h_
|
||||
|
||||
#include <directfb.h>
|
||||
|
||||
|
|
@ -54,6 +54,6 @@ extern void DirectFB_QuitModes(_THIS);
|
|||
|
||||
extern void DirectFB_SetContext(_THIS, SDL_Window *window);
|
||||
|
||||
#endif /* _SDL_directfb_modes_h */
|
||||
#endif /* SDL_directfb_modes_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -36,10 +36,8 @@ static SDL_Cursor *DirectFB_CreateDefaultCursor(void);
|
|||
static SDL_Cursor *DirectFB_CreateCursor(SDL_Surface * surface,
|
||||
int hot_x, int hot_y);
|
||||
static int DirectFB_ShowCursor(SDL_Cursor * cursor);
|
||||
static void DirectFB_MoveCursor(SDL_Cursor * cursor);
|
||||
static void DirectFB_FreeCursor(SDL_Cursor * cursor);
|
||||
static void DirectFB_WarpMouse(SDL_Window * window, int x, int y);
|
||||
static void DirectFB_FreeMouse(SDL_Mouse * mouse);
|
||||
|
||||
static const char *arrow[] = {
|
||||
/* pixels */
|
||||
|
|
@ -84,11 +82,9 @@ DirectFB_CreateDefaultCursor(void)
|
|||
|
||||
SDL_DFB_DEVICEDATA(dev);
|
||||
DFB_CursorData *curdata;
|
||||
DFBResult ret;
|
||||
DFBSurfaceDescription dsc;
|
||||
SDL_Cursor *cursor;
|
||||
Uint32 *dest;
|
||||
Uint32 *p;
|
||||
int pitch, i, j;
|
||||
|
||||
SDL_DFB_ALLOC_CLEAR( cursor, sizeof(*cursor));
|
||||
|
|
@ -139,7 +135,6 @@ DirectFB_CreateCursor(SDL_Surface * surface, int hot_x, int hot_y)
|
|||
|
||||
SDL_DFB_DEVICEDATA(dev);
|
||||
DFB_CursorData *curdata;
|
||||
DFBResult ret;
|
||||
DFBSurfaceDescription dsc;
|
||||
SDL_Cursor *cursor;
|
||||
Uint32 *dest;
|
||||
|
|
@ -184,7 +179,6 @@ static int
|
|||
DirectFB_ShowCursor(SDL_Cursor * cursor)
|
||||
{
|
||||
SDL_DFB_CURSORDATA(cursor);
|
||||
DFBResult ret;
|
||||
SDL_Window *window;
|
||||
|
||||
window = SDL_GetFocusWindow();
|
||||
|
|
@ -239,7 +233,6 @@ DirectFB_WarpMouse(SDL_Window * window, int x, int y)
|
|||
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
|
||||
DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata;
|
||||
DFB_WindowData *windata = (DFB_WindowData *) window->driverdata;
|
||||
DFBResult ret;
|
||||
int cx, cy;
|
||||
|
||||
SDL_DFB_CHECKERR(windata->dfbwin->GetPosition(windata->dfbwin, &cx, &cy));
|
||||
|
|
@ -253,8 +246,10 @@ DirectFB_WarpMouse(SDL_Window * window, int x, int y)
|
|||
|
||||
#if USE_MULTI_API
|
||||
|
||||
static void DirectFB_MoveCursor(SDL_Cursor * cursor);
|
||||
static void DirectFB_WarpMouse(SDL_Mouse * mouse, SDL_Window * window,
|
||||
int x, int y);
|
||||
static void DirectFB_FreeMouse(SDL_Mouse * mouse);
|
||||
|
||||
static int id_mask;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -19,8 +19,8 @@
|
|||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef _SDL_DirectFB_mouse_h
|
||||
#define _SDL_DirectFB_mouse_h
|
||||
#ifndef SDL_DirectFB_mouse_h_
|
||||
#define SDL_DirectFB_mouse_h_
|
||||
|
||||
#include <directfb.h>
|
||||
|
||||
|
|
@ -39,6 +39,6 @@ struct _DFB_CursorData
|
|||
extern void DirectFB_InitMouse(_THIS);
|
||||
extern void DirectFB_QuitMouse(_THIS);
|
||||
|
||||
#endif /* _SDL_DirectFB_mouse_h */
|
||||
#endif /* SDL_DirectFB_mouse_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -117,9 +117,9 @@ DirectFB_GL_LoadLibrary(_THIS, const char *path)
|
|||
|
||||
|
||||
if (path == NULL) {
|
||||
path = SDL_getenv("SDL_VIDEO_GL_DRIVER");
|
||||
path = SDL_getenv("SDL_OPENGL_LIBRARY");
|
||||
if (path == NULL) {
|
||||
path = "libGL.so";
|
||||
path = "libGL.so.1";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -133,7 +133,6 @@ DirectFB_GL_LoadLibrary(_THIS, const char *path)
|
|||
SDL_DFB_DEBUG("Loaded library: %s\n", path);
|
||||
|
||||
_this->gl_config.dll_handle = handle;
|
||||
_this->gl_config.driver_loaded = 1;
|
||||
if (path) {
|
||||
SDL_strlcpy(_this->gl_config.driver_path, path,
|
||||
SDL_arraysize(_this->gl_config.driver_path));
|
||||
|
|
@ -151,16 +150,10 @@ static void
|
|||
DirectFB_GL_UnloadLibrary(_THIS)
|
||||
{
|
||||
#if 0
|
||||
int ret;
|
||||
|
||||
if (_this->gl_config.driver_loaded) {
|
||||
|
||||
ret = GL_UnloadObject(_this->gl_config.dll_handle);
|
||||
if (ret)
|
||||
SDL_DFB_ERR("Error #%d trying to unload library.\n", ret);
|
||||
_this->gl_config.dll_handle = NULL;
|
||||
_this->gl_config.driver_loaded = 0;
|
||||
}
|
||||
int ret = GL_UnloadObject(_this->gl_config.dll_handle);
|
||||
if (ret)
|
||||
SDL_DFB_ERR("Error #%d trying to unload library.\n", ret);
|
||||
_this->gl_config.dll_handle = NULL;
|
||||
#endif
|
||||
/* Free OpenGL memory */
|
||||
SDL_free(_this->gl_data);
|
||||
|
|
@ -246,18 +239,12 @@ DirectFB_GL_GetSwapInterval(_THIS)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
DirectFB_GL_SwapWindow(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
DFBRegion region;
|
||||
DirectFB_GLContext *p;
|
||||
|
||||
region.x1 = 0;
|
||||
region.y1 = 0;
|
||||
region.x2 = window->w;
|
||||
region.y2 = window->h;
|
||||
|
||||
#if 0
|
||||
if (devdata->glFinish)
|
||||
devdata->glFinish();
|
||||
|
|
@ -273,9 +260,9 @@ DirectFB_GL_SwapWindow(_THIS, SDL_Window * window)
|
|||
}
|
||||
|
||||
SDL_DFB_CHECKERR(windata->window_surface->Flip(windata->window_surface,NULL, DSFLIP_PIPELINE |DSFLIP_BLIT | DSFLIP_ONSYNC ));
|
||||
return;
|
||||
return 0;
|
||||
error:
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -20,8 +20,8 @@
|
|||
*/
|
||||
|
||||
|
||||
#ifndef _SDL_directfb_opengl_h
|
||||
#define _SDL_directfb_opengl_h
|
||||
#ifndef SDL_directfb_opengl_h_
|
||||
#define SDL_directfb_opengl_h_
|
||||
|
||||
#include "SDL_DirectFB_video.h"
|
||||
|
||||
|
|
@ -50,7 +50,7 @@ extern int DirectFB_GL_MakeCurrent(_THIS, SDL_Window * window,
|
|||
SDL_GLContext context);
|
||||
extern int DirectFB_GL_SetSwapInterval(_THIS, int interval);
|
||||
extern int DirectFB_GL_GetSwapInterval(_THIS);
|
||||
extern void DirectFB_GL_SwapWindow(_THIS, SDL_Window * window);
|
||||
extern int DirectFB_GL_SwapWindow(_THIS, SDL_Window * window);
|
||||
extern void DirectFB_GL_DeleteContext(_THIS, SDL_GLContext context);
|
||||
|
||||
extern void DirectFB_GL_FreeWindowContexts(_THIS, SDL_Window * window);
|
||||
|
|
@ -59,6 +59,6 @@ extern void DirectFB_GL_DestroyWindowContexts(_THIS, SDL_Window * window);
|
|||
|
||||
#endif /* SDL_DIRECTFB_OPENGL */
|
||||
|
||||
#endif /* _SDL_directfb_opengl_h */
|
||||
#endif /* SDL_directfb_opengl_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -217,7 +217,9 @@ static SDL_INLINE IDirectFBSurface *get_dfb_surface(SDL_Window *window)
|
|||
SDL_memset(&wm_info, 0, sizeof(SDL_SysWMinfo));
|
||||
|
||||
SDL_VERSION(&wm_info.version);
|
||||
SDL_GetWindowWMInfo(window, &wm_info);
|
||||
if (!SDL_GetWindowWMInfo(window, &wm_info)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return wm_info.info.dfb.surface;
|
||||
}
|
||||
|
|
@ -228,7 +230,9 @@ static SDL_INLINE IDirectFBWindow *get_dfb_window(SDL_Window *window)
|
|||
SDL_memset(&wm_info, 0, sizeof(SDL_SysWMinfo));
|
||||
|
||||
SDL_VERSION(&wm_info.version);
|
||||
SDL_GetWindowWMInfo(window, &wm_info);
|
||||
if (!SDL_GetWindowWMInfo(window, &wm_info)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return wm_info.info.dfb.window;
|
||||
}
|
||||
|
|
@ -332,7 +336,7 @@ DirectFB_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
|
|||
}
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
DirectFB_RenderClear(SDL_Renderer * renderer)
|
||||
{
|
||||
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
||||
|
|
@ -344,7 +348,6 @@ DirectFB_RenderClear(SDL_Renderer * renderer)
|
|||
|
||||
destsurf->Clear(destsurf, renderer->r, renderer->g, renderer->b, renderer->a);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -357,6 +360,10 @@ DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags)
|
|||
DirectFB_RenderData *data = NULL;
|
||||
DFBSurfaceCapabilities scaps;
|
||||
|
||||
if (!winsurf) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
SDL_DFB_ALLOC_CLEAR(renderer, sizeof(*renderer));
|
||||
SDL_DFB_ALLOC_CLEAR(data, sizeof(*data));
|
||||
|
||||
|
|
@ -530,7 +537,7 @@ DirectFB_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
|||
/* find the right pixelformat */
|
||||
pixelformat = DirectFB_SDLToDFBPixelFormat(texture->format);
|
||||
if (pixelformat == DSPF_UNKNOWN) {
|
||||
SDL_SetError("Unknown pixel format %d\n", data->format);
|
||||
SDL_SetError("Unknown pixel format %d", data->format);
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
|
@ -1273,7 +1280,7 @@ DirectFB_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
|
|||
Uint32 format, void * pixels, int pitch)
|
||||
{
|
||||
Uint32 sdl_format;
|
||||
void * laypixels;
|
||||
unsigned char* laypixels;
|
||||
int laypitch;
|
||||
DFBSurfacePixelFormat dfb_format;
|
||||
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
||||
|
|
@ -1303,7 +1310,7 @@ DirectFB_RenderWritePixels(SDL_Renderer * renderer, const SDL_Rect * rect,
|
|||
SDL_Window *window = renderer->window;
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
Uint32 sdl_format;
|
||||
void * laypixels;
|
||||
unsigned char* laypixels;
|
||||
int laypitch;
|
||||
DFBSurfacePixelFormat dfb_format;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -29,25 +29,22 @@
|
|||
|
||||
#include "../SDL_shape_internals.h"
|
||||
|
||||
SDL_Window*
|
||||
DirectFB_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags) {
|
||||
return SDL_CreateWindow(title,x,y,w,h,flags /* | SDL_DFB_WINDOW_SHAPED */);
|
||||
}
|
||||
|
||||
SDL_WindowShaper*
|
||||
DirectFB_CreateShaper(SDL_Window* window) {
|
||||
SDL_WindowShaper* result = NULL;
|
||||
SDL_ShapeData* data;
|
||||
int resized_properly;
|
||||
|
||||
result = malloc(sizeof(SDL_WindowShaper));
|
||||
result->window = window;
|
||||
result->mode.mode = ShapeModeDefault;
|
||||
result->mode.parameters.binarizationCutoff = 1;
|
||||
result->userx = result->usery = 0;
|
||||
SDL_ShapeData* data = SDL_malloc(sizeof(SDL_ShapeData));
|
||||
data = SDL_malloc(sizeof(SDL_ShapeData));
|
||||
result->driverdata = data;
|
||||
data->surface = NULL;
|
||||
window->shaper = result;
|
||||
int resized_properly = DirectFB_ResizeWindowShape(window);
|
||||
resized_properly = DirectFB_ResizeWindowShape(window);
|
||||
SDL_assert(resized_properly == 0);
|
||||
|
||||
return result;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -19,8 +19,8 @@
|
|||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef _SDL_DirectFB_shape_h
|
||||
#define _SDL_DirectFB_shape_h
|
||||
#ifndef SDL_DirectFB_shape_h_
|
||||
#define SDL_DirectFB_shape_h_
|
||||
|
||||
#include <directfb.h>
|
||||
|
||||
|
|
@ -31,9 +31,8 @@ typedef struct {
|
|||
IDirectFBSurface *surface;
|
||||
} SDL_ShapeData;
|
||||
|
||||
extern SDL_Window* DirectFB_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags);
|
||||
extern SDL_WindowShaper* DirectFB_CreateShaper(SDL_Window* window);
|
||||
extern int DirectFB_ResizeWindowShape(SDL_Window* window);
|
||||
extern int DirectFB_SetWindowShape(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shapeMode);
|
||||
|
||||
#endif /* _SDL_DirectFB_shape_h */
|
||||
#endif /* SDL_DirectFB_shape_h_ */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -22,14 +22,10 @@
|
|||
|
||||
#if SDL_VIDEO_DRIVER_DIRECTFB
|
||||
|
||||
#include "SDL_DirectFB_video.h"
|
||||
|
||||
#include "SDL_DirectFB_events.h"
|
||||
/*
|
||||
* #include "SDL_DirectFB_keyboard.h"
|
||||
*/
|
||||
#include "SDL_DirectFB_modes.h"
|
||||
#include "SDL_DirectFB_mouse.h"
|
||||
#include "SDL_DirectFB_opengl.h"
|
||||
#include "SDL_DirectFB_window.h"
|
||||
#include "SDL_DirectFB_WM.h"
|
||||
|
|
@ -107,16 +103,14 @@ DirectFB_CreateDevice(int devindex)
|
|||
/* Initialize all variables that we clean on shutdown */
|
||||
SDL_DFB_ALLOC_CLEAR(device, sizeof(SDL_VideoDevice));
|
||||
|
||||
/* Set the function pointers */
|
||||
|
||||
/* Set the function pointers */
|
||||
device->VideoInit = DirectFB_VideoInit;
|
||||
device->VideoQuit = DirectFB_VideoQuit;
|
||||
device->GetDisplayModes = DirectFB_GetDisplayModes;
|
||||
device->SetDisplayMode = DirectFB_SetDisplayMode;
|
||||
device->PumpEvents = DirectFB_PumpEventsWindow;
|
||||
device->CreateWindow = DirectFB_CreateWindow;
|
||||
device->CreateWindowFrom = DirectFB_CreateWindowFrom;
|
||||
device->CreateSDLWindow = DirectFB_CreateWindow;
|
||||
device->CreateSDLWindowFrom = DirectFB_CreateWindowFrom;
|
||||
device->SetWindowTitle = DirectFB_SetWindowTitle;
|
||||
device->SetWindowIcon = DirectFB_SetWindowIcon;
|
||||
device->SetWindowPosition = DirectFB_SetWindowPosition;
|
||||
|
|
@ -178,7 +172,7 @@ DirectFB_DeviceInformation(IDirectFB * dfb)
|
|||
SDL_DFB_LOG( "Driver Version: %d.%d", desc.driver.major,
|
||||
desc.driver.minor);
|
||||
|
||||
SDL_DFB_LOG( "Video memoory: %d", desc.video_memory);
|
||||
SDL_DFB_LOG( "Video memory: %d", desc.video_memory);
|
||||
|
||||
SDL_DFB_LOG( "Blitting flags:");
|
||||
for (n = 0; blitting_flags[n].flag; n++) {
|
||||
|
|
@ -234,8 +228,7 @@ DirectFB_VideoInit(_THIS)
|
|||
DirectFBSetOption("disable-module", "x11input");
|
||||
}
|
||||
|
||||
/* FIXME: Reenable as default once multi kbd/mouse interface is sorted out */
|
||||
devdata->use_linux_input = readBoolEnv(DFBENV_USE_LINUX_INPUT, 0); /* default: on */
|
||||
devdata->use_linux_input = readBoolEnv(DFBENV_USE_LINUX_INPUT, 1); /* default: on */
|
||||
|
||||
if (!devdata->use_linux_input)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -21,8 +21,8 @@
|
|||
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_DirectFB_video_h
|
||||
#define _SDL_DirectFB_video_h
|
||||
#ifndef SDL_DirectFB_video_h_
|
||||
#define SDL_DirectFB_video_h_
|
||||
|
||||
#include <directfb.h>
|
||||
#include <directfb_version.h>
|
||||
|
|
@ -167,4 +167,4 @@ DFBSurfacePixelFormat DirectFB_SDLToDFBPixelFormat(Uint32 format);
|
|||
void DirectFB_SetSupportedPixelFormats(SDL_RendererInfo *ri);
|
||||
|
||||
|
||||
#endif /* _SDL_DirectFB_video_h */
|
||||
#endif /* SDL_DirectFB_video_h_ */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
|
@ -458,9 +458,29 @@ SDL_bool
|
|||
DirectFB_GetWindowWMInfo(_THIS, SDL_Window * window,
|
||||
struct SDL_SysWMinfo * info)
|
||||
{
|
||||
const Uint32 version = ((((Uint32) info->version.major) * 1000000) +
|
||||
(((Uint32) info->version.minor) * 10000) +
|
||||
(((Uint32) info->version.patch)));
|
||||
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
|
||||
/* Before 2.0.6, it was possible to build an SDL with DirectFB support
|
||||
(SDL_SysWMinfo will be large enough to hold DirectFB info), but build
|
||||
your app against SDL headers that didn't have DirectFB support
|
||||
(SDL_SysWMinfo could be smaller than DirectFB needs. This would lead
|
||||
to an app properly using SDL_GetWindowWMInfo() but we'd accidentally
|
||||
overflow memory on the stack or heap. To protect against this, we've
|
||||
padded out the struct unconditionally in the headers and DirectFB will
|
||||
just return an error for older apps using this function. Those apps
|
||||
will need to be recompiled against newer headers or not use DirectFB,
|
||||
maybe by forcing SDL_VIDEODRIVER=x11. */
|
||||
if (version < 2000006) {
|
||||
info->subsystem = SDL_SYSWM_UNKNOWN;
|
||||
SDL_SetError("Version must be 2.0.6 or newer");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (info->version.major == SDL_MAJOR_VERSION &&
|
||||
info->version.minor == SDL_MINOR_VERSION) {
|
||||
info->subsystem = SDL_SYSWM_DIRECTFB;
|
||||
|
|
@ -469,7 +489,7 @@ DirectFB_GetWindowWMInfo(_THIS, SDL_Window * window,
|
|||
info->info.dfb.surface = windata->surface;
|
||||
return SDL_TRUE;
|
||||
} else {
|
||||
SDL_SetError("Application not compiled with SDL %d.%d\n",
|
||||
SDL_SetError("Application not compiled with SDL %d.%d",
|
||||
SDL_MAJOR_VERSION, SDL_MINOR_VERSION);
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue