#include "egl_tracker.h"

#include "egllog.h"

void
drm_visual_modes_destroy(__GLcontextModes *modes)
{
   _eglLog(_EGL_DEBUG, "%s", __FUNCTION__);

   while (modes) {
      __GLcontextModes * const next = modes->next;
      free(modes);
      modes = next;
   }
}

__GLcontextModes *
drm_visual_modes_create(unsigned count, size_t minimum_size)
{
	/* This code copied from libGLX, and modified */
	const size_t size = (minimum_size > sizeof(__GLcontextModes))
		? minimum_size : sizeof(__GLcontextModes);
	__GLcontextModes * head = NULL;
	__GLcontextModes ** next;
	unsigned   i;

	_eglLog(_EGL_DEBUG, "%s %d %d", __FUNCTION__, count, minimum_size);

	next = & head;
	for (i = 0 ; i < count ; i++) {
		*next = (__GLcontextModes *) calloc(1, size);
		if (*next == NULL) {
			drm_visual_modes_destroy(head);
			head = NULL;
			break;
		}

		(*next)->doubleBufferMode = 1;
		(*next)->visualID = GLX_DONT_CARE;
		(*next)->visualType = GLX_DONT_CARE;
		(*next)->visualRating = GLX_NONE;
		(*next)->transparentPixel = GLX_NONE;
		(*next)->transparentRed = GLX_DONT_CARE;
		(*next)->transparentGreen = GLX_DONT_CARE;
		(*next)->transparentBlue = GLX_DONT_CARE;
		(*next)->transparentAlpha = GLX_DONT_CARE;
		(*next)->transparentIndex = GLX_DONT_CARE;
		(*next)->xRenderable = GLX_DONT_CARE;
		(*next)->fbconfigID = GLX_DONT_CARE;
		(*next)->swapMethod = GLX_SWAP_UNDEFINED_OML;
		(*next)->bindToTextureRgb = GLX_DONT_CARE;
		(*next)->bindToTextureRgba = GLX_DONT_CARE;
		(*next)->bindToMipmapTexture = GLX_DONT_CARE;
		(*next)->bindToTextureTargets = 0;
		(*next)->yInverted = GLX_DONT_CARE;

		next = & ((*next)->next);
	}

	return head;
}

__GLcontextModes *
drm_visual_from_config(_EGLConfig *conf)
{
	__GLcontextModes *visual;
	(void)conf;

	visual = drm_visual_modes_create(1, sizeof(*visual));
	visual->redBits = 8;
	visual->greenBits = 8;
	visual->blueBits = 8;
	visual->alphaBits = 8;

	visual->rgbBits = 32;
	visual->doubleBufferMode = 1;

	visual->depthBits = 24;
	visual->haveDepthBuffer = visual->depthBits > 0;
	visual->stencilBits = 8;
	visual->haveStencilBuffer = visual->stencilBits > 0;

	return visual;
}