HelloAPIHeaderFile
Header file for OpenGLESHelloAPI class.
/*!********************************************************************************************************************* \File OpenGLESHelloAPI.h \Title OpenGL ES Hello API Header \Author PowerVR by Imagination, Developer Technology Team. \Copyright Copyright(c) Imagination Technologies Limited. \brief Header file for OpenGLESHelloAPI class. ***********************************************************************************************************************/ #pragma once #define DYNAMICGLES_NO_NAMESPACE #define DYNAMICEGL_NO_NAMESPACE #include <DynamicGles.h> #include <vector> #if defined(SUPPORT_X11) #include "X11/Xlib.h" #include "X11/Xutil.h" #endif #if defined(SUPPORT_WAYLAND) #include <wayland-client.h> #include <wayland-server.h> #include <wayland-egl.h> #include <linux/input.h> #endif #if defined(__GBM__) #include <xf86drm.h> #include <xf86drmMode.h> #include <gbm.h> #endif
SurfaceData is dependent on platform, so check which platform is currently being used, then define appropriate surface data.
struct SurfaceData { float width = 1280.0f, height = 800.0f; #if defined(_Win32) HDC deviceContext = NULL; HWND window = NULL; #elif defined(ANDROID) || (__ANDROID__) ANativeWindow* window; EGLNativeDisplayType deviceContext = 0; #elif defined(APPLE) || defined(SUPPORT_APPLE) int deviceContext = (EGLNativeDisplayType)0; void* window = NULL; #elif defined(SUPPORT_X11) Display* deviceContext = 0; Window window = NULL; #elif defined(SUPPORT_WAYLAND) wl_display* deviceContext = NULL; wl_egl_window* window = NULL; #elif defined(__GBM__) gbm_device* deviceContext = NULL; gbm_surface* window = NULL; #else // NullWS EGLNativeDisplayType deviceContext = (EGLNativeDisplayType)0; EGLNativeWindowType window = (EGLNativeWindowType)0; SurfaceData() = default; #endif }; static const char* procAddressMessageTypes[] = { "INFORMATION: ", "ERROR: ", }; inline void logOutput(bool error, const char* const formatString, va_list argumentList) { #if defined(__ANDROID__)
Note: There may be issues displaying 64bits values with this function.
Note: This function will truncate long messages.
__android_log_vprint(error ? ANDROID_LOG_ERROR : ANDROID_LOG_INFO, "com.powervr.Example", formatString, argumentList); #elif defined(__QNXNTO__) vslogf(1, error ? _SLOG_INFO : _SLOG_ERROR, formatString, argumentList); #else // Not android Not QNX FILE* logfile = fopen("Log.txt", "w"); static char buffer[4096]; va_list tempList; memset(buffer, 0, sizeof(buffer)); #if (defined _MSC_VER) // Pre VS2013 tempList = argumentList; #else va_copy(tempList, argumentList); #endif vsnprintf(buffer, 4095, formatString, argumentList); fprintf(logfile, "%s%s\n", procAddressMessageTypes[(int)error], buffer); fclose(logfile); #if defined(_WIN32) if (IsDebuggerPresent()) { OutputDebugString(procAddressMessageTypes[(int)error]); OutputDebugString(buffer); OutputDebugString("\n"); } else #endif { printf("%s%s\n", procAddressMessageTypes[error], buffer); } #endif } inline void Log(bool error, const char* const formatString, ...) { va_list argumentList; va_start(argumentList, formatString); logOutput(error, formatString, argumentList); va_end(argumentList); }
glm includes for matrix and transformation calculations
#define GLM_ENABLE_EXPERIMENTAL #include "../../../external/glm/glm.hpp" #include "../../../external/glm/gtc/type_ptr.hpp" #include "../../../external/glm/gtx/transform.hpp"
Image data
#define imageWidth 256 #define imageHeight 256 class OpenGLESAPI { private:
Functions used to set up EGL state.
bool createEGLDisplay(); bool chooseEGLConfig(EGLConfig& config); bool createEGLSurface(EGLConfig config); bool setupEGLContext(EGLConfig config, EGLContext& context);
Handles for the two shaders used to draw the triangle, and the program handle which combines them.
GLuint _fragmentShader, _vertexShader; GLuint _shaderProgram;
A vertex buffer object to store the model data.
GLuint _vertexBuffer;
Handle to the texture used in application.
GLuint _texture;
Index to bind the attributes to vertex shaders.
const unsigned int _vertexArray = 0; const unsigned int _textureArray = 1;
Count rotation angle.
float _angle;
OpenGL ES initialisation functions.
void generateTextureData(); bool initializeTexture(); bool initializeShaders(); bool initializeBuffer();
Error check functions.
bool testEGLError(SurfaceData surfaceData, const char* functionLastCalled); bool testGLError(SurfaceData surfaceData, const char* functionLastCalled);
EGL objects are required to be permanent, for accessing in OpenGL ES functions.
EGLSurface _eglSurface; EGLDisplay _eglDisplay; public:
Initialise EGL and GLES states.
bool initializeGLES(); bool initializeEGL();
Per frame render.
bool renderScene(); bool swapEGLBuffers(); bool drawFrame();
Release EGL state and objects.
void releaseEGLState();
De-initialise GL state and objects.
void releaseGLState();
Surface data relevant to current build platform.
SurfaceData _surfaceData;
Declaration of image data.
GLubyte _image[imageWidth][imageHeight][4]; };