1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2014 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker // queryconversions.h: Declaration of state query cast conversions 8*8975f5c5SAndroid Build Coastguard Worker 9*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_QUERY_CONVERSIONS_H_ 10*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_QUERY_CONVERSIONS_H_ 11*8975f5c5SAndroid Build Coastguard Worker 12*8975f5c5SAndroid Build Coastguard Worker #include "angle_gl.h" 13*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h" 14*8975f5c5SAndroid Build Coastguard Worker 15*8975f5c5SAndroid Build Coastguard Worker namespace gl 16*8975f5c5SAndroid Build Coastguard Worker { 17*8975f5c5SAndroid Build Coastguard Worker class Context; 18*8975f5c5SAndroid Build Coastguard Worker 19*8975f5c5SAndroid Build Coastguard Worker // Helper class for converting a GL type to a GLenum: 20*8975f5c5SAndroid Build Coastguard Worker // We can't use CastStateValueEnum generally, because of GLboolean + GLubyte overlap. 21*8975f5c5SAndroid Build Coastguard Worker // We restrict our use to CastFromStateValue and CastQueryValueTo, where it eliminates 22*8975f5c5SAndroid Build Coastguard Worker // duplicate parameters. 23*8975f5c5SAndroid Build Coastguard Worker 24*8975f5c5SAndroid Build Coastguard Worker template <typename GLType> 25*8975f5c5SAndroid Build Coastguard Worker struct GLTypeToGLenum 26*8975f5c5SAndroid Build Coastguard Worker { 27*8975f5c5SAndroid Build Coastguard Worker // static constexpr GLenum value; 28*8975f5c5SAndroid Build Coastguard Worker }; 29*8975f5c5SAndroid Build Coastguard Worker 30*8975f5c5SAndroid Build Coastguard Worker template <> 31*8975f5c5SAndroid Build Coastguard Worker struct GLTypeToGLenum<GLint> 32*8975f5c5SAndroid Build Coastguard Worker { 33*8975f5c5SAndroid Build Coastguard Worker static constexpr GLenum value = GL_INT; 34*8975f5c5SAndroid Build Coastguard Worker }; 35*8975f5c5SAndroid Build Coastguard Worker template <> 36*8975f5c5SAndroid Build Coastguard Worker struct GLTypeToGLenum<GLuint> 37*8975f5c5SAndroid Build Coastguard Worker { 38*8975f5c5SAndroid Build Coastguard Worker static constexpr GLenum value = GL_UNSIGNED_INT; 39*8975f5c5SAndroid Build Coastguard Worker }; 40*8975f5c5SAndroid Build Coastguard Worker template <> 41*8975f5c5SAndroid Build Coastguard Worker struct GLTypeToGLenum<GLboolean> 42*8975f5c5SAndroid Build Coastguard Worker { 43*8975f5c5SAndroid Build Coastguard Worker static constexpr GLenum value = GL_BOOL; 44*8975f5c5SAndroid Build Coastguard Worker }; 45*8975f5c5SAndroid Build Coastguard Worker template <> 46*8975f5c5SAndroid Build Coastguard Worker struct GLTypeToGLenum<GLint64> 47*8975f5c5SAndroid Build Coastguard Worker { 48*8975f5c5SAndroid Build Coastguard Worker static constexpr GLenum value = GL_INT_64_ANGLEX; 49*8975f5c5SAndroid Build Coastguard Worker }; 50*8975f5c5SAndroid Build Coastguard Worker template <> 51*8975f5c5SAndroid Build Coastguard Worker struct GLTypeToGLenum<GLuint64> 52*8975f5c5SAndroid Build Coastguard Worker { 53*8975f5c5SAndroid Build Coastguard Worker static constexpr GLenum value = GL_UINT_64_ANGLEX; 54*8975f5c5SAndroid Build Coastguard Worker }; 55*8975f5c5SAndroid Build Coastguard Worker template <> 56*8975f5c5SAndroid Build Coastguard Worker struct GLTypeToGLenum<GLfloat> 57*8975f5c5SAndroid Build Coastguard Worker { 58*8975f5c5SAndroid Build Coastguard Worker static constexpr GLenum value = GL_FLOAT; 59*8975f5c5SAndroid Build Coastguard Worker }; 60*8975f5c5SAndroid Build Coastguard Worker 61*8975f5c5SAndroid Build Coastguard Worker GLint CastMaskValue(GLuint value); 62*8975f5c5SAndroid Build Coastguard Worker 63*8975f5c5SAndroid Build Coastguard Worker template <typename QueryT, typename InternalT> 64*8975f5c5SAndroid Build Coastguard Worker QueryT CastFromGLintStateValue(GLenum pname, InternalT value); 65*8975f5c5SAndroid Build Coastguard Worker 66*8975f5c5SAndroid Build Coastguard Worker template <typename QueryT, typename NativeT> 67*8975f5c5SAndroid Build Coastguard Worker QueryT CastFromStateValue(GLenum pname, NativeT value); 68*8975f5c5SAndroid Build Coastguard Worker 69*8975f5c5SAndroid Build Coastguard Worker template <typename NativeT, typename QueryT> 70*8975f5c5SAndroid Build Coastguard Worker NativeT CastQueryValueTo(GLenum pname, QueryT value); 71*8975f5c5SAndroid Build Coastguard Worker 72*8975f5c5SAndroid Build Coastguard Worker template <typename ParamType> 73*8975f5c5SAndroid Build Coastguard Worker GLenum ConvertToGLenum(GLenum pname, ParamType param) 74*8975f5c5SAndroid Build Coastguard Worker { 75*8975f5c5SAndroid Build Coastguard Worker return static_cast<GLenum>(CastQueryValueTo<GLuint>(pname, param)); 76*8975f5c5SAndroid Build Coastguard Worker } 77*8975f5c5SAndroid Build Coastguard Worker 78*8975f5c5SAndroid Build Coastguard Worker template <typename ParamType> 79*8975f5c5SAndroid Build Coastguard Worker GLenum ConvertToGLenum(ParamType param) 80*8975f5c5SAndroid Build Coastguard Worker { 81*8975f5c5SAndroid Build Coastguard Worker return ConvertToGLenum(GL_NONE, param); 82*8975f5c5SAndroid Build Coastguard Worker } 83*8975f5c5SAndroid Build Coastguard Worker 84*8975f5c5SAndroid Build Coastguard Worker template <typename OutType> 85*8975f5c5SAndroid Build Coastguard Worker OutType ConvertGLenum(GLenum param) 86*8975f5c5SAndroid Build Coastguard Worker { 87*8975f5c5SAndroid Build Coastguard Worker return static_cast<OutType>(param); 88*8975f5c5SAndroid Build Coastguard Worker } 89*8975f5c5SAndroid Build Coastguard Worker 90*8975f5c5SAndroid Build Coastguard Worker template <typename InType, typename OutType> 91*8975f5c5SAndroid Build Coastguard Worker void ConvertGLenumValue(InType param, OutType *out) 92*8975f5c5SAndroid Build Coastguard Worker { 93*8975f5c5SAndroid Build Coastguard Worker *out = ConvertGLenum<OutType>(static_cast<GLenum>(param)); 94*8975f5c5SAndroid Build Coastguard Worker } 95*8975f5c5SAndroid Build Coastguard Worker 96*8975f5c5SAndroid Build Coastguard Worker template <typename PackedEnumType, typename OutType> 97*8975f5c5SAndroid Build Coastguard Worker void ConvertPackedEnum(PackedEnumType param, OutType *out) 98*8975f5c5SAndroid Build Coastguard Worker { 99*8975f5c5SAndroid Build Coastguard Worker *out = static_cast<OutType>(ToGLenum(param)); 100*8975f5c5SAndroid Build Coastguard Worker } 101*8975f5c5SAndroid Build Coastguard Worker 102*8975f5c5SAndroid Build Coastguard Worker template <typename ParamType> 103*8975f5c5SAndroid Build Coastguard Worker GLint ConvertToGLint(ParamType param) 104*8975f5c5SAndroid Build Coastguard Worker { 105*8975f5c5SAndroid Build Coastguard Worker return CastQueryValueTo<GLint>(GL_NONE, param); 106*8975f5c5SAndroid Build Coastguard Worker } 107*8975f5c5SAndroid Build Coastguard Worker 108*8975f5c5SAndroid Build Coastguard Worker template <typename ParamType> 109*8975f5c5SAndroid Build Coastguard Worker GLfloat ConvertToGLfloat(ParamType param) 110*8975f5c5SAndroid Build Coastguard Worker { 111*8975f5c5SAndroid Build Coastguard Worker return CastQueryValueTo<GLfloat>(GL_NONE, param); 112*8975f5c5SAndroid Build Coastguard Worker } 113*8975f5c5SAndroid Build Coastguard Worker 114*8975f5c5SAndroid Build Coastguard Worker template <typename ParamType> 115*8975f5c5SAndroid Build Coastguard Worker bool ConvertToBool(ParamType param) 116*8975f5c5SAndroid Build Coastguard Worker { 117*8975f5c5SAndroid Build Coastguard Worker return param != GL_FALSE; 118*8975f5c5SAndroid Build Coastguard Worker } 119*8975f5c5SAndroid Build Coastguard Worker 120*8975f5c5SAndroid Build Coastguard Worker template <typename ParamType> 121*8975f5c5SAndroid Build Coastguard Worker GLboolean ConvertToGLBoolean(ParamType param) 122*8975f5c5SAndroid Build Coastguard Worker { 123*8975f5c5SAndroid Build Coastguard Worker return param ? GL_TRUE : GL_FALSE; 124*8975f5c5SAndroid Build Coastguard Worker } 125*8975f5c5SAndroid Build Coastguard Worker 126*8975f5c5SAndroid Build Coastguard Worker // The GL state query API types are: bool, int, uint, float, int64, uint64 127*8975f5c5SAndroid Build Coastguard Worker template <typename QueryT> 128*8975f5c5SAndroid Build Coastguard Worker void CastStateValues(const Context *context, 129*8975f5c5SAndroid Build Coastguard Worker GLenum nativeType, 130*8975f5c5SAndroid Build Coastguard Worker GLenum pname, 131*8975f5c5SAndroid Build Coastguard Worker unsigned int numParams, 132*8975f5c5SAndroid Build Coastguard Worker QueryT *outParams); 133*8975f5c5SAndroid Build Coastguard Worker 134*8975f5c5SAndroid Build Coastguard Worker // The GL state query API types are: bool, int, uint, float, int64, uint64 135*8975f5c5SAndroid Build Coastguard Worker template <typename QueryT> 136*8975f5c5SAndroid Build Coastguard Worker void CastIndexedStateValues(Context *context, 137*8975f5c5SAndroid Build Coastguard Worker GLenum nativeType, 138*8975f5c5SAndroid Build Coastguard Worker GLenum pname, 139*8975f5c5SAndroid Build Coastguard Worker GLuint index, 140*8975f5c5SAndroid Build Coastguard Worker unsigned int numParams, 141*8975f5c5SAndroid Build Coastguard Worker QueryT *outParams); 142*8975f5c5SAndroid Build Coastguard Worker } // namespace gl 143*8975f5c5SAndroid Build Coastguard Worker 144*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_QUERY_CONVERSIONS_H_ 145