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];
 };