// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
//
// 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.

// Config.h: Defines the egl::Config class, describing the format, type
// and size for an egl::Surface. Implements EGLConfig and related functionality.
// [EGL 1.4] section 3.4 page 15.

#ifndef INCLUDE_CONFIG_H_
#define INCLUDE_CONFIG_H_

#include "Renderer/Surface.hpp"

#include <EGL/egl.h>

#include <set>

namespace egl
{
class Display;

class Config
{
public:
	Config(sw::Format displayFormat, EGLint minSwapInterval, EGLint maxSwapInterval, sw::Format renderTargetFormat, sw::Format depthStencilFormat, EGLint multiSample);

	EGLConfig getHandle() const;

	const sw::Format mDisplayFormat;
	const sw::Format mRenderTargetFormat;
	const sw::Format mDepthStencilFormat;
	const EGLint mMultiSample;

	EGLint mBufferSize;              // Depth of the color buffer
	EGLint mRedSize;                 // Bits of Red in the color buffer
	EGLint mGreenSize;               // Bits of Green in the color buffer
	EGLint mBlueSize;                // Bits of Blue in the color buffer
	EGLint mLuminanceSize;           // Bits of Luminance in the color buffer
	EGLint mAlphaSize;               // Bits of Alpha in the color buffer
	EGLint mAlphaMaskSize;           // Bits of Alpha Mask in the mask buffer
	EGLBoolean mBindToTextureRGB;    // True if bindable to RGB textures.
	EGLBoolean mBindToTextureRGBA;   // True if bindable to RGBA textures.
	EGLenum mColorBufferType;        // Color buffer type
	EGLenum mConfigCaveat;           // Any caveats for the configuration
	EGLint mConfigID;                // Unique EGLConfig identifier
	EGLint mConformant;              // Whether contexts created with this config are conformant
	EGLint mDepthSize;               // Bits of Z in the depth buffer
	EGLint mLevel;                   // Frame buffer level
	EGLBoolean mMatchNativePixmap;   // Match the native pixmap format
	EGLint mMaxPBufferWidth;         // Maximum width of pbuffer
	EGLint mMaxPBufferHeight;        // Maximum height of pbuffer
	EGLint mMaxPBufferPixels;        // Maximum size of pbuffer
	EGLint mMaxSwapInterval;         // Maximum swap interval
	EGLint mMinSwapInterval;         // Minimum swap interval
	EGLBoolean mNativeRenderable;    // EGL_TRUE if native rendering APIs can render to surface
	EGLint mNativeVisualID;          // Handle of corresponding native visual
	EGLint mNativeVisualType;        // Native visual type of the associated visual
	EGLint mRenderableType;          // Which client rendering APIs are supported.
	EGLint mSampleBuffers;           // Number of multisample buffers
	EGLint mSamples;                 // Number of samples per pixel
	EGLint mStencilSize;             // Bits of Stencil in the stencil buffer
	EGLint mSurfaceType;             // Which types of EGL surfaces are supported.
	EGLenum mTransparentType;        // Type of transparency supported
	EGLint mTransparentRedValue;     // Transparent red value
	EGLint mTransparentGreenValue;   // Transparent green value
	EGLint mTransparentBlueValue;    // Transparent blue value

	EGLBoolean mRecordableAndroid;          // EGL_ANDROID_recordable
	EGLBoolean mFramebufferTargetAndroid;   // EGL_ANDROID_framebuffer_target
};

struct CompareConfig
{
	bool operator()(const Config &x, const Config &y) const;
};

class ConfigSet
{
	friend class Display;

public:
	ConfigSet();

	void add(sw::Format displayFormat, EGLint minSwapInterval, EGLint maxSwapInterval, sw::Format renderTargetFormat, sw::Format depthStencilFormat, EGLint multiSample);
	size_t size() const;
	bool getConfigs(EGLConfig *configs, const EGLint *attribList, EGLint configSize, EGLint *numConfig);
	const egl::Config *get(EGLConfig configHandle);

private:
	typedef std::set<Config, CompareConfig> Set;
	typedef Set::iterator Iterator;
	Set mSet;
};
}

#endif   // INCLUDE_CONFIG_H_
