Merge libepoxy 1.3.1
This commit is contained in:
parent
2f1d1574a3
commit
8e64ef27c6
6
dist/libepoxy/.dir-locals.el
vendored
6
dist/libepoxy/.dir-locals.el
vendored
@ -1,6 +0,0 @@
|
|||||||
((nil
|
|
||||||
(indent-tabs-mode . nil)
|
|
||||||
(tab-width . 8)
|
|
||||||
(c-basic-offset . 4)
|
|
||||||
)
|
|
||||||
)
|
|
95
dist/libepoxy/.gitignore
vendored
95
dist/libepoxy/.gitignore
vendored
@ -1,95 +0,0 @@
|
|||||||
#
|
|
||||||
# X.Org module default exclusion patterns
|
|
||||||
# The next section if for module specific patterns
|
|
||||||
#
|
|
||||||
# Do not edit the following section
|
|
||||||
# GNU Build System (Autotools)
|
|
||||||
aclocal.m4
|
|
||||||
autom4te.cache/
|
|
||||||
autoscan.log
|
|
||||||
ChangeLog
|
|
||||||
compile
|
|
||||||
config.guess
|
|
||||||
config.h
|
|
||||||
config.h.in
|
|
||||||
config.log
|
|
||||||
config-ml.in
|
|
||||||
config.py
|
|
||||||
config.status
|
|
||||||
config.status.lineno
|
|
||||||
config.sub
|
|
||||||
configure
|
|
||||||
configure.scan
|
|
||||||
depcomp
|
|
||||||
.deps/
|
|
||||||
INSTALL
|
|
||||||
install-sh
|
|
||||||
.libs/
|
|
||||||
libtool
|
|
||||||
libtool.m4
|
|
||||||
ltmain.sh
|
|
||||||
lt~obsolete.m4
|
|
||||||
ltoptions.m4
|
|
||||||
ltsugar.m4
|
|
||||||
ltversion.m4
|
|
||||||
Makefile
|
|
||||||
Makefile.in
|
|
||||||
mdate-sh
|
|
||||||
missing
|
|
||||||
mkinstalldirs
|
|
||||||
*.pc
|
|
||||||
py-compile
|
|
||||||
stamp-h?
|
|
||||||
symlink-tree
|
|
||||||
texinfo.tex
|
|
||||||
ylwrap
|
|
||||||
src/sna/git_version.h
|
|
||||||
src/sna/brw/brw_test
|
|
||||||
|
|
||||||
# Do not edit the following section
|
|
||||||
# Edit Compile Debug Document Distribute
|
|
||||||
*~
|
|
||||||
*.[0-9]
|
|
||||||
*.[0-9]x
|
|
||||||
*.bak
|
|
||||||
*.bin
|
|
||||||
core
|
|
||||||
*.dll
|
|
||||||
*.exe
|
|
||||||
*-ISO*.bdf
|
|
||||||
*-JIS*.bdf
|
|
||||||
*-KOI8*.bdf
|
|
||||||
*.kld
|
|
||||||
*.ko
|
|
||||||
*.ko.cmd
|
|
||||||
*.lai
|
|
||||||
*.l[oa]
|
|
||||||
*.[oa]
|
|
||||||
*.obj
|
|
||||||
*.patch
|
|
||||||
*.so
|
|
||||||
*.pcf.gz
|
|
||||||
*.pdb
|
|
||||||
*.tar.bz2
|
|
||||||
*.tar.gz
|
|
||||||
#
|
|
||||||
# Add & Override patterns for gldispatch
|
|
||||||
#
|
|
||||||
# Edit the following section as needed
|
|
||||||
# For example, !report.pc overrides *.pc. See 'man gitignore'
|
|
||||||
#
|
|
||||||
configure.lineno
|
|
||||||
.dirstamp
|
|
||||||
test-driver
|
|
||||||
|
|
||||||
gl_generated_dispatch.c
|
|
||||||
gl_generated.h
|
|
||||||
|
|
||||||
glx_generated_dispatch.c
|
|
||||||
glx_generated.h
|
|
||||||
|
|
||||||
egl_generated_dispatch.c
|
|
||||||
egl_generated.h
|
|
||||||
|
|
||||||
wgl_generated_dispatch.c
|
|
||||||
wgl_generated.h
|
|
14
dist/libepoxy/autogen.sh
vendored
14
dist/libepoxy/autogen.sh
vendored
@ -1,14 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
|
|
||||||
srcdir=`dirname $0`
|
|
||||||
test -z "$srcdir" && srcdir=.
|
|
||||||
|
|
||||||
ORIGDIR=`pwd`
|
|
||||||
cd $srcdir
|
|
||||||
|
|
||||||
autoreconf -v --install || exit 1
|
|
||||||
cd $ORIGDIR || exit $?
|
|
||||||
|
|
||||||
if test -z "$NOCONFIGURE"; then
|
|
||||||
$srcdir/configure "$@"
|
|
||||||
fi
|
|
107
dist/libepoxy/src/dispatch_common.c
vendored
107
dist/libepoxy/src/dispatch_common.c
vendored
@ -104,16 +104,42 @@
|
|||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
#define GLX_LIB "/opt/X11/lib/libGL.1.dylib"
|
#define GLX_LIB "/opt/X11/lib/libGL.1.dylib"
|
||||||
|
#elif defined(ANDROID)
|
||||||
|
#define GLX_LIB "libGLESv2.so"
|
||||||
#elif defined(__OpenBSD__)
|
#elif defined(__OpenBSD__)
|
||||||
#define GLX_LIB "libGL.so"
|
#define GLX_LIB "libGL.so"
|
||||||
#define EGL_LIB "libEGL.so"
|
|
||||||
#define GLESV1_LIB "libGLESv1_CM.so"
|
|
||||||
#define GLESV2_LIB "libGLESv2.so"
|
|
||||||
#else
|
#else
|
||||||
#define GLX_LIB "libGL.so.1"
|
#define GLX_LIB "libGL.so.1"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ANDROID) || defined(__OpenBSD__)
|
||||||
|
#define EGL_LIB "libEGL.so"
|
||||||
|
#define GLES1_LIB "libGLESv1_CM.so"
|
||||||
|
#define GLES2_LIB "libGLESv2.so"
|
||||||
|
#else
|
||||||
#define EGL_LIB "libEGL.so.1"
|
#define EGL_LIB "libEGL.so.1"
|
||||||
#define GLESV1_LIB "libGLESv1_CM.so.1"
|
#define GLES1_LIB "libGLESv1_CM.so.1"
|
||||||
#define GLESV2_LIB "libGLESv2.so.2"
|
#define GLES2_LIB "libGLESv2.so.2"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#define CONSTRUCT(_func) static void _func (void) __attribute__((constructor));
|
||||||
|
#define DESTRUCT(_func) static void _func (void) __attribute__((destructor));
|
||||||
|
#elif defined (_MSC_VER) && (_MSC_VER >= 1500)
|
||||||
|
#define CONSTRUCT(_func) \
|
||||||
|
static void _func(void); \
|
||||||
|
static int _func ## _wrapper(void) { _func(); return 0; } \
|
||||||
|
__pragma(section(".CRT$XCU",read)) \
|
||||||
|
__declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _wrapper;
|
||||||
|
|
||||||
|
#define DESTRUCT(_func) \
|
||||||
|
static void _func(void); \
|
||||||
|
static int _func ## _constructor(void) { atexit (_func); return 0; } \
|
||||||
|
__pragma(section(".CRT$XCU",read)) \
|
||||||
|
__declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _constructor;
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error "You will need constructor support for your compiler"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct api {
|
struct api {
|
||||||
@ -161,18 +187,21 @@ struct api {
|
|||||||
static struct api api = {
|
static struct api api = {
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
.mutex = PTHREAD_MUTEX_INITIALIZER,
|
.mutex = PTHREAD_MUTEX_INITIALIZER,
|
||||||
|
#else
|
||||||
|
0,
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool library_initialized;
|
static bool library_initialized;
|
||||||
|
|
||||||
|
static bool epoxy_current_context_is_glx(void);
|
||||||
|
|
||||||
#if PLATFORM_HAS_EGL
|
#if PLATFORM_HAS_EGL
|
||||||
static EGLenum
|
static EGLenum
|
||||||
epoxy_egl_get_current_gl_context_api(void);
|
epoxy_egl_get_current_gl_context_api(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void
|
CONSTRUCT (library_init)
|
||||||
library_init(void) __attribute__((constructor));
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
library_init(void)
|
library_init(void)
|
||||||
@ -244,6 +273,24 @@ epoxy_is_desktop_gl(void)
|
|||||||
const char *es_prefix = "OpenGL ES";
|
const char *es_prefix = "OpenGL ES";
|
||||||
const char *version;
|
const char *version;
|
||||||
|
|
||||||
|
#if PLATFORM_HAS_EGL
|
||||||
|
/* PowerVR's OpenGL ES implementation (and perhaps other) don't
|
||||||
|
* comply with the standard, which states that
|
||||||
|
* "glGetString(GL_VERSION)" should return a string starting with
|
||||||
|
* "OpenGL ES". Therefore, to distinguish desktop OpenGL from
|
||||||
|
* OpenGL ES, we must also check the context type through EGL (we
|
||||||
|
* can do that as PowerVR is only usable through EGL).
|
||||||
|
*/
|
||||||
|
if (!epoxy_current_context_is_glx()) {
|
||||||
|
switch (epoxy_egl_get_current_gl_context_api()) {
|
||||||
|
case EGL_OPENGL_API: return true;
|
||||||
|
case EGL_OPENGL_ES_API: return false;
|
||||||
|
case EGL_NONE:
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (api.begin_count)
|
if (api.begin_count)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@ -290,7 +337,7 @@ epoxy_gl_version(void)
|
|||||||
return epoxy_internal_gl_version(0);
|
return epoxy_internal_gl_version(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
PUBLIC int
|
int
|
||||||
epoxy_conservative_gl_version(void)
|
epoxy_conservative_gl_version(void)
|
||||||
{
|
{
|
||||||
if (api.begin_count)
|
if (api.begin_count)
|
||||||
@ -327,12 +374,13 @@ epoxy_internal_has_gl_extension(const char *ext, bool invalid_op_mode)
|
|||||||
return epoxy_extension_in_string(exts, ext);
|
return epoxy_extension_in_string(exts, ext);
|
||||||
} else {
|
} else {
|
||||||
int num_extensions;
|
int num_extensions;
|
||||||
|
int i;
|
||||||
|
|
||||||
glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions);
|
glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions);
|
||||||
if (num_extensions == 0)
|
if (num_extensions == 0)
|
||||||
return invalid_op_mode;
|
return invalid_op_mode;
|
||||||
|
|
||||||
for (int i = 0; i < num_extensions; i++) {
|
for (i = 0; i < num_extensions; i++) {
|
||||||
const char *gl_ext = (const char *)glGetStringi(GL_EXTENSIONS, i);
|
const char *gl_ext = (const char *)glGetStringi(GL_EXTENSIONS, i);
|
||||||
if (strcmp(ext, gl_ext) == 0)
|
if (strcmp(ext, gl_ext) == 0)
|
||||||
return true;
|
return true;
|
||||||
@ -373,7 +421,7 @@ epoxy_current_context_is_glx(void)
|
|||||||
sym = dlsym(NULL, "eglGetCurrentContext");
|
sym = dlsym(NULL, "eglGetCurrentContext");
|
||||||
if (sym) {
|
if (sym) {
|
||||||
if (epoxy_egl_get_current_gl_context_api() != EGL_NONE)
|
if (epoxy_egl_get_current_gl_context_api() != EGL_NONE)
|
||||||
return true;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
(void)dlerror();
|
(void)dlerror();
|
||||||
}
|
}
|
||||||
@ -454,7 +502,7 @@ epoxy_gles1_dlsym(const char *name)
|
|||||||
if (epoxy_current_context_is_glx()) {
|
if (epoxy_current_context_is_glx()) {
|
||||||
return epoxy_get_proc_address(name);
|
return epoxy_get_proc_address(name);
|
||||||
} else {
|
} else {
|
||||||
return do_dlsym(&api.gles1_handle, GLESV1_LIB, name, true);
|
return do_dlsym(&api.gles1_handle, GLES1_LIB, name, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -464,7 +512,7 @@ epoxy_gles2_dlsym(const char *name)
|
|||||||
if (epoxy_current_context_is_glx()) {
|
if (epoxy_current_context_is_glx()) {
|
||||||
return epoxy_get_proc_address(name);
|
return epoxy_get_proc_address(name);
|
||||||
} else {
|
} else {
|
||||||
return do_dlsym(&api.gles2_handle, GLESV2_LIB, name, true);
|
return do_dlsym(&api.gles2_handle, GLES2_LIB, name, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -484,7 +532,7 @@ epoxy_gles3_dlsym(const char *name)
|
|||||||
if (epoxy_current_context_is_glx()) {
|
if (epoxy_current_context_is_glx()) {
|
||||||
return epoxy_get_proc_address(name);
|
return epoxy_get_proc_address(name);
|
||||||
} else {
|
} else {
|
||||||
void *func = do_dlsym(&api.gles2_handle, GLESV2_LIB, name, false);
|
void *func = do_dlsym(&api.gles2_handle, GLES2_LIB, name, false);
|
||||||
|
|
||||||
if (func)
|
if (func)
|
||||||
return func;
|
return func;
|
||||||
@ -501,7 +549,13 @@ void *
|
|||||||
epoxy_get_core_proc_address(const char *name, int core_version)
|
epoxy_get_core_proc_address(const char *name, int core_version)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
int core_symbol_support = 10;
|
int core_symbol_support = 11;
|
||||||
|
#elif defined(ANDROID)
|
||||||
|
/**
|
||||||
|
* All symbols must be resolved through eglGetProcAddress
|
||||||
|
* on Android
|
||||||
|
*/
|
||||||
|
int core_symbol_support = 0;
|
||||||
#else
|
#else
|
||||||
int core_symbol_support = 12;
|
int core_symbol_support = 12;
|
||||||
#endif
|
#endif
|
||||||
@ -583,7 +637,7 @@ epoxy_get_bootstrap_proc_address(const char *name)
|
|||||||
* us. Try the GLES2 implementation first, and fall back
|
* us. Try the GLES2 implementation first, and fall back
|
||||||
* to GLES1 otherwise.
|
* to GLES1 otherwise.
|
||||||
*/
|
*/
|
||||||
get_dlopen_handle(&api.gles2_handle, GLESV2_LIB, false);
|
get_dlopen_handle(&api.gles2_handle, GLES2_LIB, false);
|
||||||
if (api.gles2_handle)
|
if (api.gles2_handle)
|
||||||
return epoxy_gles2_dlsym(name);
|
return epoxy_gles2_dlsym(name);
|
||||||
else
|
else
|
||||||
@ -623,26 +677,7 @@ epoxy_get_proc_address(const char *name)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
WRAPPER_VISIBILITY (void)
|
||||||
epoxy_print_failure_reasons(const char *name,
|
|
||||||
const char **provider_names,
|
|
||||||
const int *providers)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
fprintf(stderr, "No provider of %s found. Requires one of:\n", name);
|
|
||||||
|
|
||||||
for (i = 0; providers[i] != 0; i++)
|
|
||||||
fprintf(stderr, " %s\n",
|
|
||||||
provider_names[providers[i]]);
|
|
||||||
|
|
||||||
if (providers[0] == 0) {
|
|
||||||
fprintf(stderr, " No known providers. This is likely a bug "
|
|
||||||
"in libepoxy code generation\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
WRAPPER_VISIBILITY void
|
|
||||||
WRAPPER(epoxy_glBegin)(GLenum primtype)
|
WRAPPER(epoxy_glBegin)(GLenum primtype)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@ -656,7 +691,7 @@ WRAPPER(epoxy_glBegin)(GLenum primtype)
|
|||||||
epoxy_glBegin_unwrapped(primtype);
|
epoxy_glBegin_unwrapped(primtype);
|
||||||
}
|
}
|
||||||
|
|
||||||
WRAPPER_VISIBILITY void
|
WRAPPER_VISIBILITY (void)
|
||||||
WRAPPER(epoxy_glEnd)(void)
|
WRAPPER(epoxy_glEnd)(void)
|
||||||
{
|
{
|
||||||
epoxy_glEnd_unwrapped();
|
epoxy_glEnd_unwrapped();
|
||||||
|
24
dist/libepoxy/test/.gitignore
vendored
24
dist/libepoxy/test/.gitignore
vendored
@ -1,24 +0,0 @@
|
|||||||
egl_and_glx_different_pointers_egl
|
|
||||||
egl_and_glx_different_pointers_egl_glx
|
|
||||||
egl_and_glx_different_pointers_glx
|
|
||||||
egl_has_extension_nocontext
|
|
||||||
egl_gl
|
|
||||||
egl_gles1_without_glx
|
|
||||||
egl_gles2_without_glx
|
|
||||||
glx_alias_prefer_same_name
|
|
||||||
glx_beginend
|
|
||||||
glx_gles2
|
|
||||||
glx_glxgetprocaddress_nocontext
|
|
||||||
glx_has_extension_nocontext
|
|
||||||
glx_public_api
|
|
||||||
glx_public_api_core
|
|
||||||
glx_shared_znow
|
|
||||||
glx_static
|
|
||||||
headerguards
|
|
||||||
khronos_typedefs
|
|
||||||
miscdefines
|
|
||||||
wgl_core_and_exts
|
|
||||||
wgl_usefontbitmaps
|
|
||||||
wgl_usefontbitmaps_unicode
|
|
||||||
*.log
|
|
||||||
*.trs
|
|
93
dist/libepoxy/test/glx_alias_prefer_same_name.c
vendored
93
dist/libepoxy/test/glx_alias_prefer_same_name.c
vendored
@ -1,93 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2013 Intel Corporation
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
|
||||||
* to deal in the Software without restriction, including without limitation
|
|
||||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
* and/or sell copies of the Software, and to permit persons to whom the
|
|
||||||
* Software is furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice (including the next
|
|
||||||
* paragraph) shall be included in all copies or substantial portions of the
|
|
||||||
* Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
||||||
* IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file glx_gles2.c
|
|
||||||
*
|
|
||||||
* Catches a bug where a GLES2 context using
|
|
||||||
* GLX_EXT_create_context_es2_profile would try to find the symbols in
|
|
||||||
* libGLESv2.so.2 instead of libGL.so.1.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <err.h>
|
|
||||||
#include "epoxy/gl.h"
|
|
||||||
#include "epoxy/glx.h"
|
|
||||||
#include <X11/Xlib.h>
|
|
||||||
|
|
||||||
#include "glx_common.h"
|
|
||||||
|
|
||||||
static Display *dpy;
|
|
||||||
|
|
||||||
static int last_call;
|
|
||||||
|
|
||||||
#define CORE_FUNC_VAL 100
|
|
||||||
#define EXT_FUNC_VAL 101
|
|
||||||
|
|
||||||
void
|
|
||||||
override_GL_glBindTexture(GLenum target, GLenum texture);
|
|
||||||
void
|
|
||||||
override_GL_glBindTextureEXT(GLenum target, GLenum texture);
|
|
||||||
|
|
||||||
void
|
|
||||||
override_GL_glBindTexture(GLenum target)
|
|
||||||
{
|
|
||||||
last_call = CORE_FUNC_VAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
override_GL_glBindTexture(GLenum target)
|
|
||||||
{
|
|
||||||
last_call = EXT_FUNC_VAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
bool pass = true;
|
|
||||||
XVisualInfo *vis;
|
|
||||||
Window win;
|
|
||||||
GLXContext ctx;
|
|
||||||
GLXFBConfig config;
|
|
||||||
int context_attribs[] = {
|
|
||||||
GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_ES2_PROFILE_BIT_EXT,
|
|
||||||
GLX_CONTEXT_MAJOR_VERSION_ARB, 2,
|
|
||||||
GLX_CONTEXT_MINOR_VERSION_ARB, 0,
|
|
||||||
0
|
|
||||||
};
|
|
||||||
GLuint shader;
|
|
||||||
|
|
||||||
dpy = get_display_or_skip();
|
|
||||||
make_glx_context_current_or_skip(dpy);
|
|
||||||
|
|
||||||
if (!epoxy_has_gl_extension(dpy, 0, "GLX_EXT_texture_object"))
|
|
||||||
errx(77, "Test requires GLX_EXT_texture_object");
|
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, 1);
|
|
||||||
pass = pass && last_call == CORE_VAL;
|
|
||||||
glBindTextureEXT(GL_TEXTURE_2D, 1);
|
|
||||||
pass = pass && last_call == EXT_VAL;
|
|
||||||
|
|
||||||
return pass != true;
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user