tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

validationES2.h (7785B)


      1 //
      2 // Copyright 2018 The ANGLE Project Authors. All rights reserved.
      3 // Use of this source code is governed by a BSD-style license that can be
      4 // found in the LICENSE file.
      5 //
      6 // validationES2.h:
      7 //  Inlined validation functions for OpenGL ES 2.0 entry points.
      8 
      9 #ifndef LIBANGLE_VALIDATION_ES2_H_
     10 #define LIBANGLE_VALIDATION_ES2_H_
     11 
     12 #include "libANGLE/ErrorStrings.h"
     13 #include "libANGLE/validationES.h"
     14 #include "libANGLE/validationES2_autogen.h"
     15 
     16 namespace gl
     17 {
     18 ANGLE_INLINE bool ValidateDrawArrays(const Context *context,
     19                                     angle::EntryPoint entryPoint,
     20                                     PrimitiveMode mode,
     21                                     GLint first,
     22                                     GLsizei count)
     23 {
     24    return ValidateDrawArraysCommon(context, entryPoint, mode, first, count, 1);
     25 }
     26 
     27 ANGLE_INLINE bool ValidateUniform2f(const Context *context,
     28                                    angle::EntryPoint entryPoint,
     29                                    UniformLocation location,
     30                                    GLfloat x,
     31                                    GLfloat y)
     32 {
     33    return ValidateUniform(context, entryPoint, GL_FLOAT_VEC2, location, 1);
     34 }
     35 
     36 ANGLE_INLINE bool ValidateBindBuffer(const Context *context,
     37                                     angle::EntryPoint entryPoint,
     38                                     BufferBinding target,
     39                                     BufferID buffer)
     40 {
     41    if (!context->isValidBufferBinding(target))
     42    {
     43        context->validationError(entryPoint, GL_INVALID_ENUM, err::kInvalidBufferTypes);
     44        return false;
     45    }
     46 
     47    if (!context->getState().isBindGeneratesResourceEnabled() &&
     48        !context->isBufferGenerated(buffer))
     49    {
     50        context->validationError(entryPoint, GL_INVALID_OPERATION, err::kObjectNotGenerated);
     51        return false;
     52    }
     53 
     54    return true;
     55 }
     56 
     57 ANGLE_INLINE bool ValidateDrawElements(const Context *context,
     58                                       angle::EntryPoint entryPoint,
     59                                       PrimitiveMode mode,
     60                                       GLsizei count,
     61                                       DrawElementsType type,
     62                                       const void *indices)
     63 {
     64    return ValidateDrawElementsCommon(context, entryPoint, mode, count, type, indices, 1);
     65 }
     66 
     67 ANGLE_INLINE bool ValidateVertexAttribPointer(const Context *context,
     68                                              angle::EntryPoint entryPoint,
     69                                              GLuint index,
     70                                              GLint size,
     71                                              VertexAttribType type,
     72                                              GLboolean normalized,
     73                                              GLsizei stride,
     74                                              const void *ptr)
     75 {
     76    if (!ValidateFloatVertexFormat(context, entryPoint, index, size, type))
     77    {
     78        return false;
     79    }
     80 
     81    if (stride < 0)
     82    {
     83        context->validationError(entryPoint, GL_INVALID_VALUE, err::kNegativeStride);
     84        return false;
     85    }
     86 
     87    if (context->getClientVersion() >= ES_3_1)
     88    {
     89        const Caps &caps = context->getCaps();
     90        if (stride > caps.maxVertexAttribStride)
     91        {
     92            context->validationError(entryPoint, GL_INVALID_VALUE,
     93                                     err::kExceedsMaxVertexAttribStride);
     94            return false;
     95        }
     96 
     97        if (index >= static_cast<GLuint>(caps.maxVertexAttribBindings))
     98        {
     99            context->validationError(entryPoint, GL_INVALID_VALUE,
    100                                     err::kExceedsMaxVertexAttribBindings);
    101            return false;
    102        }
    103    }
    104 
    105    // [OpenGL ES 3.0.2] Section 2.8 page 24:
    106    // An INVALID_OPERATION error is generated when a non-zero vertex array object
    107    // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
    108    // and the pointer argument is not NULL.
    109    bool nullBufferAllowed = context->getState().areClientArraysEnabled() &&
    110                             context->getState().getVertexArray()->id().value == 0;
    111    if (!nullBufferAllowed && context->getState().getTargetBuffer(BufferBinding::Array) == 0 &&
    112        ptr != nullptr)
    113    {
    114        context->validationError(entryPoint, GL_INVALID_OPERATION, err::kClientDataInVertexArray);
    115        return false;
    116    }
    117 
    118    if (context->isWebGL())
    119    {
    120        // WebGL 1.0 [Section 6.14] Fixed point support
    121        // The WebGL API does not support the GL_FIXED data type.
    122        if (type == VertexAttribType::Fixed)
    123        {
    124            context->validationError(entryPoint, GL_INVALID_ENUM, err::kFixedNotInWebGL);
    125            return false;
    126        }
    127 
    128        if (!ValidateWebGLVertexAttribPointer(context, entryPoint, type, normalized, stride, ptr,
    129                                              false))
    130        {
    131            return false;
    132        }
    133    }
    134 
    135    return true;
    136 }
    137 
    138 void RecordBindTextureTypeError(const Context *context,
    139                                angle::EntryPoint entryPoint,
    140                                TextureType target);
    141 
    142 ANGLE_INLINE bool ValidateBindTexture(const Context *context,
    143                                      angle::EntryPoint entryPoint,
    144                                      TextureType target,
    145                                      TextureID texture)
    146 {
    147    if (!context->getStateCache().isValidBindTextureType(target))
    148    {
    149        RecordBindTextureTypeError(context, entryPoint, target);
    150        return false;
    151    }
    152 
    153    if (texture.value == 0)
    154    {
    155        return true;
    156    }
    157 
    158    Texture *textureObject = context->getTexture(texture);
    159    if (textureObject && textureObject->getType() != target)
    160    {
    161        context->validationErrorF(
    162            entryPoint, GL_INVALID_OPERATION, err::kTextureTargetMismatchWithLabel,
    163            static_cast<uint8_t>(target), static_cast<uint8_t>(textureObject->getType()),
    164            textureObject->getLabel().c_str());
    165        return false;
    166    }
    167 
    168    if (!context->getState().isBindGeneratesResourceEnabled() &&
    169        !context->isTextureGenerated(texture))
    170    {
    171        context->validationError(entryPoint, GL_INVALID_OPERATION, err::kObjectNotGenerated);
    172        return false;
    173    }
    174 
    175    return true;
    176 }
    177 
    178 // Validation of all Tex[Sub]Image2D parameters except TextureTarget.
    179 bool ValidateES2TexImageParametersBase(const Context *context,
    180                                       angle::EntryPoint entryPoint,
    181                                       TextureTarget target,
    182                                       GLint level,
    183                                       GLenum internalformat,
    184                                       bool isCompressed,
    185                                       bool isSubImage,
    186                                       GLint xoffset,
    187                                       GLint yoffset,
    188                                       GLsizei width,
    189                                       GLsizei height,
    190                                       GLint border,
    191                                       GLenum format,
    192                                       GLenum type,
    193                                       GLsizei imageSize,
    194                                       const void *pixels);
    195 
    196 // Validation of TexStorage*2DEXT
    197 bool ValidateES2TexStorageParametersBase(const Context *context,
    198                                         angle::EntryPoint entryPoint,
    199                                         TextureType target,
    200                                         GLsizei levels,
    201                                         GLenum internalformat,
    202                                         GLsizei width,
    203                                         GLsizei height);
    204 
    205 }  // namespace gl
    206 
    207 #endif  // LIBANGLE_VALIDATION_ES2_H_