363 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			363 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C++
		
	
	
	
//
 | 
						|
// Copyright (c) 2017 The Khronos Group Inc.
 | 
						|
// 
 | 
						|
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
// you may not use this file except in compliance with the License.
 | 
						|
// You may obtain a copy of the License at
 | 
						|
//
 | 
						|
//    http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
//
 | 
						|
// Unless required by applicable law or agreed to in writing, software
 | 
						|
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
// See the License for the specific language governing permissions and
 | 
						|
// limitations under the License.
 | 
						|
//
 | 
						|
#ifndef _helpers_h
 | 
						|
#define _helpers_h
 | 
						|
 | 
						|
#include "../harness/compat.h"
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
 | 
						|
#include <sys/types.h>
 | 
						|
#include <sys/stat.h>
 | 
						|
 | 
						|
#if !defined (__APPLE__)
 | 
						|
#include <CL/cl.h>
 | 
						|
#include "gl_headers.h"
 | 
						|
#include <CL/cl_gl.h>
 | 
						|
#else
 | 
						|
#include "gl_headers.h"
 | 
						|
#endif
 | 
						|
 | 
						|
#include "harness/errorHelpers.h"
 | 
						|
#include "harness/kernelHelpers.h"
 | 
						|
#include "harness/threadTesting.h"
 | 
						|
#include "harness/typeWrappers.h"
 | 
						|
#include "harness/conversions.h"
 | 
						|
#include "harness/mt19937.h"
 | 
						|
 | 
						|
typedef cl_mem
 | 
						|
(CL_API_CALL *clCreateFromGLBuffer_fn)(cl_context     context,
 | 
						|
                          cl_mem_flags   flags,
 | 
						|
                          GLuint         bufobj,
 | 
						|
                          int *          errcode_ret);
 | 
						|
 | 
						|
typedef cl_mem
 | 
						|
(CL_API_CALL *clCreateFromGLTexture_fn)(cl_context       context ,
 | 
						|
                        cl_mem_flags     flags ,
 | 
						|
                        GLenum           target ,
 | 
						|
                        GLint            miplevel ,
 | 
						|
                        GLuint           texture ,
 | 
						|
                        cl_int *         errcode_ret) ;
 | 
						|
 | 
						|
typedef cl_mem
 | 
						|
(CL_API_CALL *clCreateFromGLTexture2D_fn)(cl_context       context ,
 | 
						|
                        cl_mem_flags     flags ,
 | 
						|
                        GLenum           target ,
 | 
						|
                        GLint            miplevel ,
 | 
						|
                        GLuint           texture ,
 | 
						|
                        cl_int *         errcode_ret) ;
 | 
						|
 | 
						|
typedef cl_mem
 | 
						|
(CL_API_CALL *clCreateFromGLTexture3D_fn)(cl_context       context ,
 | 
						|
                        cl_mem_flags     flags ,
 | 
						|
                        GLenum           target ,
 | 
						|
                        GLint            miplevel ,
 | 
						|
                        GLuint           texture ,
 | 
						|
                        cl_int *         errcode_ret) ;
 | 
						|
 | 
						|
typedef cl_mem
 | 
						|
(CL_API_CALL *clCreateFromGLRenderbuffer_fn)(cl_context    context ,
 | 
						|
                           cl_mem_flags  flags ,
 | 
						|
                           GLuint        renderbuffer ,
 | 
						|
                           cl_int *      errcode_ret) ;
 | 
						|
 | 
						|
typedef cl_int
 | 
						|
(CL_API_CALL *clGetGLObjectInfo_fn)(cl_mem                 memobj ,
 | 
						|
                  cl_gl_object_type *    gl_object_type ,
 | 
						|
                  GLuint *               gl_object_name) ;
 | 
						|
 | 
						|
typedef cl_int
 | 
						|
(CL_API_CALL *clGetGLTextureInfo_fn)(cl_mem                memobj ,
 | 
						|
                   cl_gl_texture_info    param_name ,
 | 
						|
                   size_t                param_value_size ,
 | 
						|
                   void *                param_value ,
 | 
						|
                   size_t *              param_value_size_ret) ;
 | 
						|
 | 
						|
typedef cl_int
 | 
						|
(CL_API_CALL *clEnqueueAcquireGLObjects_fn)(cl_command_queue       command_queue ,
 | 
						|
                          cl_uint                num_objects ,
 | 
						|
                          const cl_mem *         mem_objects ,
 | 
						|
                          cl_uint                num_events_in_wait_list ,
 | 
						|
                          const cl_event *       event_wait_list ,
 | 
						|
                                cl_event *             event) ;
 | 
						|
 | 
						|
typedef cl_int
 | 
						|
(CL_API_CALL *clEnqueueReleaseGLObjects_fn)(cl_command_queue       command_queue ,
 | 
						|
                          cl_uint                num_objects ,
 | 
						|
                          const cl_mem *         mem_objects ,
 | 
						|
                          cl_uint                num_events_in_wait_list ,
 | 
						|
                          const cl_event *       event_wait_list ,
 | 
						|
                                cl_event *             event) ;
 | 
						|
 | 
						|
 | 
						|
extern clCreateFromGLBuffer_fn clCreateFromGLBuffer_ptr;
 | 
						|
extern clCreateFromGLTexture_fn clCreateFromGLTexture_ptr;
 | 
						|
extern clCreateFromGLTexture2D_fn clCreateFromGLTexture2D_ptr;
 | 
						|
extern clCreateFromGLTexture3D_fn clCreateFromGLTexture3D_ptr;
 | 
						|
extern clCreateFromGLRenderbuffer_fn clCreateFromGLRenderbuffer_ptr;
 | 
						|
extern clGetGLObjectInfo_fn clGetGLObjectInfo_ptr;
 | 
						|
extern clGetGLTextureInfo_fn clGetGLTextureInfo_ptr;
 | 
						|
extern clEnqueueAcquireGLObjects_fn clEnqueueAcquireGLObjects_ptr;
 | 
						|
extern clEnqueueReleaseGLObjects_fn clEnqueueReleaseGLObjects_ptr;
 | 
						|
 | 
						|
 | 
						|
class glBufferWrapper
 | 
						|
{
 | 
						|
    public:
 | 
						|
        glBufferWrapper() { mBuffer = 0; }
 | 
						|
        glBufferWrapper( GLuint b ) { mBuffer = b; }
 | 
						|
        ~glBufferWrapper() { if( mBuffer != 0 ) glDeleteBuffers( 1, &mBuffer ); }
 | 
						|
 | 
						|
        glBufferWrapper & operator=( const GLuint &rhs ) { mBuffer = rhs; return *this; }
 | 
						|
        operator GLuint() { return mBuffer; }
 | 
						|
        operator GLuint *() { return &mBuffer; }
 | 
						|
 | 
						|
        GLuint * operator&() { return &mBuffer; }
 | 
						|
 | 
						|
        bool operator==( GLuint rhs ) { return mBuffer == rhs; }
 | 
						|
 | 
						|
    protected:
 | 
						|
 | 
						|
        GLuint mBuffer;
 | 
						|
};
 | 
						|
 | 
						|
class glTextureWrapper
 | 
						|
{
 | 
						|
    public:
 | 
						|
        glTextureWrapper() { mHandle = 0; }
 | 
						|
        glTextureWrapper( GLuint b ) { mHandle = b; }
 | 
						|
        ~glTextureWrapper() {
 | 
						|
         if( mHandle != 0 ) glDeleteTextures( 1, &mHandle );
 | 
						|
        }
 | 
						|
 | 
						|
        glTextureWrapper & operator=( const GLuint &rhs ) { mHandle = rhs; return *this; }
 | 
						|
        operator GLuint() { return mHandle; }
 | 
						|
        operator GLuint *() { return &mHandle; }
 | 
						|
 | 
						|
        GLuint * operator&() { return &mHandle; }
 | 
						|
 | 
						|
        bool operator==( GLuint rhs ) { return mHandle == rhs; }
 | 
						|
 | 
						|
    protected:
 | 
						|
 | 
						|
    // The texture handle.
 | 
						|
        GLuint mHandle;
 | 
						|
};
 | 
						|
 | 
						|
class glRenderbufferWrapper
 | 
						|
{
 | 
						|
    public:
 | 
						|
        glRenderbufferWrapper() { mBuffer = 0; }
 | 
						|
        glRenderbufferWrapper( GLuint b ) { mBuffer = b; }
 | 
						|
        ~glRenderbufferWrapper() { if( mBuffer != 0 ) glDeleteRenderbuffersEXT( 1, &mBuffer ); }
 | 
						|
 | 
						|
        glRenderbufferWrapper & operator=( const GLuint &rhs ) { mBuffer = rhs; return *this; }
 | 
						|
        operator GLuint() { return mBuffer; }
 | 
						|
        operator GLuint *() { return &mBuffer; }
 | 
						|
 | 
						|
        GLuint * operator&() { return &mBuffer; }
 | 
						|
 | 
						|
        bool operator==( GLuint rhs ) { return mBuffer == rhs; }
 | 
						|
 | 
						|
    protected:
 | 
						|
 | 
						|
        GLuint mBuffer;
 | 
						|
};
 | 
						|
 | 
						|
class glFramebufferWrapper
 | 
						|
{
 | 
						|
    public:
 | 
						|
        glFramebufferWrapper() { mBuffer = 0; }
 | 
						|
        glFramebufferWrapper( GLuint b ) { mBuffer = b; }
 | 
						|
        ~glFramebufferWrapper() { if( mBuffer != 0 ) glDeleteFramebuffersEXT( 1, &mBuffer ); }
 | 
						|
 | 
						|
        glFramebufferWrapper & operator=( const GLuint &rhs ) { mBuffer = rhs; return *this; }
 | 
						|
        operator GLuint() { return mBuffer; }
 | 
						|
        operator GLuint *() { return &mBuffer; }
 | 
						|
 | 
						|
        GLuint * operator&() { return &mBuffer; }
 | 
						|
 | 
						|
        bool operator==( GLuint rhs ) { return mBuffer == rhs; }
 | 
						|
 | 
						|
    protected:
 | 
						|
 | 
						|
        GLuint mBuffer;
 | 
						|
};
 | 
						|
 | 
						|
class glVertexArraysWrapper
 | 
						|
{
 | 
						|
public:
 | 
						|
  glVertexArraysWrapper() { mBuffer = 0; }
 | 
						|
  glVertexArraysWrapper( GLuint b ) { mBuffer = b; }
 | 
						|
  ~glVertexArraysWrapper() { if( mBuffer != 0 ) glDeleteVertexArrays( 1, &mBuffer ); }
 | 
						|
 | 
						|
  glVertexArraysWrapper & operator=( const GLuint &rhs ) { mBuffer = rhs; return *this; }
 | 
						|
  operator GLuint() { return mBuffer; }
 | 
						|
  operator GLuint *() { return &mBuffer; }
 | 
						|
 | 
						|
  GLuint * operator&() { return &mBuffer; }
 | 
						|
 | 
						|
  bool operator==( GLuint rhs ) { return mBuffer == rhs; }
 | 
						|
 | 
						|
protected:
 | 
						|
 | 
						|
  GLuint mBuffer;
 | 
						|
};
 | 
						|
 | 
						|
class glProgramWrapper
 | 
						|
{
 | 
						|
public:
 | 
						|
  glProgramWrapper() { mProgram = 0; }
 | 
						|
  glProgramWrapper( GLuint b ) { mProgram = b; }
 | 
						|
  ~glProgramWrapper() { if( mProgram != 0 ) glDeleteProgram( mProgram ); }
 | 
						|
 | 
						|
  glProgramWrapper & operator=( const GLuint &rhs ) { mProgram = rhs; return *this; }
 | 
						|
  operator GLuint() { return mProgram; }
 | 
						|
  operator GLuint *() { return &mProgram; }
 | 
						|
 | 
						|
  GLuint * operator&() { return &mProgram; }
 | 
						|
 | 
						|
  bool operator==( GLuint rhs ) { return mProgram == rhs; }
 | 
						|
 | 
						|
protected:
 | 
						|
 | 
						|
  GLuint mProgram;
 | 
						|
};
 | 
						|
 | 
						|
class glShaderWrapper
 | 
						|
{
 | 
						|
public:
 | 
						|
  glShaderWrapper() { mShader = 0; }
 | 
						|
  glShaderWrapper( GLuint b ) { mShader = b; }
 | 
						|
  ~glShaderWrapper() { if( mShader != 0 ) glDeleteShader( mShader ); }
 | 
						|
 | 
						|
  glShaderWrapper & operator=( const GLuint &rhs ) { mShader = rhs; return *this; }
 | 
						|
  operator GLuint() { return mShader; }
 | 
						|
  operator GLuint *() { return &mShader; }
 | 
						|
 | 
						|
  GLuint * operator&() { return &mShader; }
 | 
						|
 | 
						|
  bool operator==( GLuint rhs ) { return mShader == rhs; }
 | 
						|
 | 
						|
protected:
 | 
						|
 | 
						|
  GLuint mShader;
 | 
						|
};
 | 
						|
 | 
						|
// Helper functions (defined in helpers.cpp)
 | 
						|
 | 
						|
extern void * CreateGLTexture1DArray( size_t width, size_t length,
 | 
						|
  GLenum target, GLenum glFormat, GLenum internalFormat, GLenum glType,
 | 
						|
  ExplicitType type, GLuint *outTextureID, int *outError,
 | 
						|
  bool allocateMem, MTdata d);
 | 
						|
 | 
						|
extern void * CreateGLTexture2DArray( size_t width, size_t height, size_t length,
 | 
						|
  GLenum target, GLenum glFormat, GLenum internalFormat, GLenum glType,
 | 
						|
  ExplicitType type, GLuint *outTextureID, int *outError,
 | 
						|
  bool allocateMem, MTdata d);
 | 
						|
 | 
						|
extern void * CreateGLTextureBuffer( size_t width,
 | 
						|
  GLenum target, GLenum glFormat, GLenum internalFormat, GLenum glType,
 | 
						|
  ExplicitType type, GLuint *outTex, GLuint *outBuf, int *outError,
 | 
						|
  bool allocateMem, MTdata d);
 | 
						|
 | 
						|
extern void * CreateGLTexture1D(size_t width,
 | 
						|
                                GLenum target, GLenum glFormat,
 | 
						|
                                GLenum internalFormat, GLenum glType,
 | 
						|
                                ExplicitType type, GLuint *outTextureID,
 | 
						|
                                int *outError, bool allocateMem, MTdata d );
 | 
						|
 | 
						|
extern void * CreateGLTexture2D( size_t width, size_t height,
 | 
						|
                               GLenum target, GLenum glFormat,
 | 
						|
                               GLenum internalFormat, GLenum glType,
 | 
						|
                               ExplicitType type, GLuint *outTextureID,
 | 
						|
                               int *outError, bool allocateMem, MTdata d );
 | 
						|
 | 
						|
 | 
						|
extern void * CreateGLTexture3D( size_t width, size_t height, size_t depth,
 | 
						|
                                 GLenum target, GLenum glFormat,
 | 
						|
                                 GLenum internalFormat, GLenum glType,
 | 
						|
                                 ExplicitType type, GLuint *outTextureID,
 | 
						|
                                 int *outError, MTdata d, bool allocateMem = true );
 | 
						|
 | 
						|
#ifdef GL_VERSION_3_2
 | 
						|
extern void * CreateGLTexture2DMultisample( size_t width, size_t height, size_t samples,
 | 
						|
                                           GLenum target, GLenum glFormat,
 | 
						|
                                           GLenum internalFormat, GLenum glType,
 | 
						|
                                           ExplicitType type, GLuint *outTextureID,
 | 
						|
                                           int *outError, bool allocateMem, MTdata d,
 | 
						|
                                           bool fixedSampleLocations );
 | 
						|
 | 
						|
extern void * CreateGLTexture2DArrayMultisample( size_t width, size_t height,
 | 
						|
                                                size_t length, size_t samples,
 | 
						|
                                                GLenum target, GLenum glFormat,
 | 
						|
                                                GLenum internalFormat, GLenum glType,
 | 
						|
                                                ExplicitType type, GLuint *outTextureID,
 | 
						|
                                                int *outError, bool allocateMem, MTdata d,
 | 
						|
                                                bool fixedSampleLocations );
 | 
						|
#endif
 | 
						|
 | 
						|
extern void * ReadGLTexture( GLenum glTarget, GLuint glTexture, GLuint glBuf, GLint width,
 | 
						|
                             GLenum glFormat, GLenum glInternalFormat,
 | 
						|
                             GLenum glType, ExplicitType typeToReadAs,
 | 
						|
                             size_t outWidth, size_t outHeight );
 | 
						|
 | 
						|
extern int CreateGLRenderbufferRaw( GLsizei width, GLsizei height,
 | 
						|
                                   GLenum target, GLenum glFormat,
 | 
						|
                                   GLenum internalFormat, GLenum glType,
 | 
						|
                                   GLuint *outFramebuffer,
 | 
						|
                                   GLuint *outRenderbuffer );
 | 
						|
 | 
						|
extern void * CreateGLRenderbuffer( GLsizei width, GLsizei height,
 | 
						|
                                    GLenum target, GLenum glFormat,
 | 
						|
                                    GLenum internalFormat, GLenum glType,
 | 
						|
                                    ExplicitType type,
 | 
						|
                                    GLuint *outFramebuffer,
 | 
						|
                                    GLuint *outRenderbuffer,
 | 
						|
                                    int *outError, MTdata d, bool allocateMem );
 | 
						|
 | 
						|
extern void * ReadGLRenderbuffer( GLuint glFramebuffer, GLuint glRenderbuffer,
 | 
						|
                                  GLenum attachment, GLenum glFormat,
 | 
						|
                                  GLenum glInternalFormat, GLenum glType,
 | 
						|
                                  ExplicitType typeToReadAs,
 | 
						|
                                  size_t outWidth, size_t outHeight );
 | 
						|
 | 
						|
extern void DumpGLBuffer(GLenum type, size_t width, size_t height, void* buffer);
 | 
						|
extern const char *GetGLTypeName( GLenum type );
 | 
						|
extern const char *GetGLAttachmentName( GLenum att );
 | 
						|
extern const char *GetGLTargetName( GLenum tgt );
 | 
						|
extern const char *GetGLBaseFormatName( GLenum baseformat );
 | 
						|
extern const char *GetGLFormatName( GLenum format );
 | 
						|
 | 
						|
extern void* CreateRandomData( ExplicitType type, size_t count, MTdata d );
 | 
						|
 | 
						|
extern GLenum GetGLFormat(GLenum internalFormat);
 | 
						|
extern GLenum GetGLTypeForExplicitType(ExplicitType type);
 | 
						|
extern size_t GetGLTypeSize(GLenum type);
 | 
						|
extern ExplicitType GetExplicitTypeForGLType(GLenum type);
 | 
						|
 | 
						|
extern GLenum get_base_gl_target( GLenum target );
 | 
						|
 | 
						|
extern int init_clgl_ext( void );
 | 
						|
 | 
						|
extern GLint get_gl_max_samples( GLenum target, GLenum internalformat );
 | 
						|
 | 
						|
#endif // _helpers_h
 | 
						|
 | 
						|
 | 
						|
 |