/*
* Copyright (C) 2016 The Android Open Source Project
*
* 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 GLES_VALIDATION_H
#define GLES_VALIDATION_H

#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <GLES2/gl2platform.h>

#include <GLES3/gl3.h>
#include <GLES3/gl31.h>

#include "GL2Encoder.h"

#include <string>

namespace GLESv2Validation {

extern GLbitfield allBufferMapAccessFlags;
bool bufferTarget(GL2Encoder* ctx, GLenum target);
bool bufferParam(GL2Encoder* ctx, GLenum param);

bool pixelStoreParam(GL2Encoder* ctx, GLenum param);
bool pixelStoreValue(GLenum param, GLint value);

bool rboFormat(GL2Encoder* ctx, GLenum internalformat);

bool framebufferTarget(GL2Encoder* ctx, GLenum target);
bool framebufferAttachment(GL2Encoder* ctx, GLenum attachment);

bool readPixelsFormat(GLenum format);
bool readPixelsType(GLenum type);

bool vertexAttribType(GL2Encoder* ctx, GLenum type);

bool readPixelsFboFormatMatch(GLenum format, GLenum type, GLenum fboTexType);
bool blitFramebufferFormat(GLenum readFormat, GLenum drawFormat);

bool textureTarget(GL2Encoder* ctx, GLenum target);

GLsizei compressedTexImageSize(GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);

bool isCompressedFormat(GLenum internalformat);
bool supportedCompressedFormat(GL2Encoder* ctx, GLenum internalformat);

bool unsizedFormat(GLenum format);

bool filterableTexFormat(GL2Encoder* ctx, GLenum internalformat);
bool colorRenderableFormat(GL2Encoder* ctx, GLenum internalformat);
bool depthRenderableFormat(GL2Encoder* ctx, GLenum internalformat);
bool stencilRenderableFormat(GL2Encoder* ctx, GLenum internalformat);

bool isCubeMapTarget(GLenum target);

bool pixelType(GL2Encoder* ctx, GLenum type);
bool pixelFormat(GL2Encoder* ctx, GLenum format);

bool pixelInternalFormat(GLenum internalformat);

bool shaderType(GL2Encoder* ctx, GLenum type);

bool internalFormatTarget(GL2Encoder* ctx, GLenum target);

std::string vertexAttribIndexRangeErrorMsg(GL2Encoder* ctx, GLuint index);

} // namespace GLESv2Validation

#endif