/*
 * (C) Copyright IBM Corporation 2004, 2005
 * All Rights Reserved.
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sub license,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
 * IBM,
 * AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

#ifndef _INDIRECT_VA_PRIVATE_
#define _INDIRECT_VA_PRIVATE_

/**
 * \file indirect_va_private.h
 *
 * \author Ian Romanick <idr@us.ibm.com>
 */

#include <inttypes.h>

#include "glxclient.h"
#include "indirect.h"
#include <GL/glxproto.h>


/**
 * State descriptor for a single array of vertex data.
 */
struct array_state {
    /**
     * Pointer to the application supplied data.
     */
    const void * data;
    
    /**
     * Enum representing the type of the application supplied data.
     */
    GLenum data_type;

    /**
     * Stride value supplied by the application.  This value is not used
     * internally.  It is only kept so that it can be queried by the
     * application using glGet*v.
     */
    GLsizei user_stride;

    /**
     * Calculated size, in bytes, of a single element in the array.  This
     * is calculated based on \c count and the size of the data type
     * represented by \c data_type.
     */
    GLsizei element_size;

    /**
     * Actual byte-stride from one element to the next.  This value will
     * be equal to either \c user_stride or \c element_stride.
     */
    GLsizei true_stride;

    /**
     * Number of data values in each element.
     */
    GLint count;

    /**
     * "Normalized" data is on the range [0,1] (unsigned) or [-1,1] (signed).
     * This is used for mapping integral types to floating point types.
     */
    GLboolean normalized;

    /**
     * Pre-calculated GLX protocol command header.
     */
    uint32_t header[2];
    
    /**
     * Size of the header data.  For simple data, like glColorPointerfv,
     * this is 4.  For complex data that requires either a count (e.g.,
     * glWeightfvARB), an index (e.g., glVertexAttrib1fvARB), or a
     * selector enum (e.g., glMultiTexCoord2fv) this is 8.
     */
    unsigned header_size;
    
    /**
     * Set to \c GL_TRUE if this array is enabled.  Otherwise, it is set
     * to \c GL_FALSE.
     */
    GLboolean  enabled;

    /**
     * For multi-arrayed data (e.g., texture coordinates, generic vertex
     * program attributes, etc.), this specifies which array this is.
     */
    unsigned index;
    
    /**
     * Per-array-type key.  For most arrays, this will be the GL enum for
     * that array (e.g., GL_VERTEX_ARRAY for vertex data, GL_NORMAL_ARRAY
     * for normal data, GL_TEXTURE_COORD_ARRAY for texture coordinate data,
     * etc.).
     */
    GLenum key;

    /**
     * If this array can be used with the "classic" \c glDrawArrays protocol,
     * this is set to \c GL_TRUE.  Otherwise, it is set to \c GL_FALSE.
     */
    GLboolean old_DrawArrays_possible;
};


/**
 * Array state that is pushed / poped by \c glPushClientAttrib and
 * \c glPopClientAttrib.
 */
struct array_stack_state {
    /**
     * Pointer to the application supplied data.
     */
    const void * data;
    
    /**
     * Enum representing the type of the application supplied data.
     */
    GLenum data_type;

    /**
     * Stride value supplied by the application.  This value is not used
     * internally.  It is only kept so that it can be queried by the
     * application using glGet*v.
     */
    GLsizei user_stride;

    /**
     * Number of data values in each element.
     */
    GLint count;

    /**
     * Per-array-type key.  For most arrays, this will be the GL enum for
     * that array (e.g., GL_VERTEX_ARRAY for vertex data, GL_NORMAL_ARRAY
     * for normal data, GL_TEXTURE_COORD_ARRAY for texture coordinate data,
     * etc.).
     */
    GLenum key;

    /**
     * For multi-arrayed data (e.g., texture coordinates, generic vertex
     * program attributes, etc.), this specifies which array this is.
     */
    unsigned index;

    /**
     * Set to \c GL_TRUE if this array is enabled.  Otherwise, it is set
     * to \c GL_FALSE.
     */
    GLboolean  enabled;
};


/**
 * Collection of all the vertex array state.
 */
struct array_state_vector {
    /**
     * Number of arrays tracked by \c ::arrays.
     */
    size_t num_arrays;

    /**
     * Array of vertex array state.  This array contains all of the valid
     * vertex arrays.  If a vertex array isn't in this array, then it isn't
     * valid.  For example, if an implementation does not support
     * EXT_fog_coord, there won't be a GL_FOG_COORD_ARRAY entry in this
     * array.
     */
    struct array_state * arrays;

    /**
     * Number of currently enabled client-side arrays.  The value of this 
     * field is only valid if \c array_info_cache_valid is true.
     */
    size_t enabled_client_array_count;

    /**
     * \name ARRAY_INFO cache.
     * 
     * These fields track the state of the ARRAY_INFO cache.  The
     * \c array_info_cache_size is the size of the actual data stored in
     * \c array_info_cache.  \c array_info_cache_buffer_size is the size of
     * the buffer.  This will always be greater than or equal to
     * \c array_info_cache_size.
     *
     * \note
     * There are some bytes of extra data before \c array_info_cache that is
     * used to hold the header for RenderLarge commands.  This is
     * \b not included in \c array_info_cache_size or
     * \c array_info_cache_buffer_size.  \c array_info_cache_base stores a
     * pointer to the true start of the buffer (i.e., what malloc returned).
     */
    /*@{*/
    size_t array_info_cache_size;
    size_t array_info_cache_buffer_size;
    void * array_info_cache;
    void * array_info_cache_base;
    /*@}*/


    /**
     * Is the cache of ARRAY_INFO data valid?  The cache can become invalid
     * when one of several state changes occur.  Among these chages are
     * modifying the array settings for an enabled array and enabling /
     * disabling an array.
     */
    GLboolean array_info_cache_valid;

    /**
     * Is it possible to use the GL 1.1 / EXT_vertex_arrays protocol?  Use
     * of this protocol is disabled with really old servers (i.e., servers
     * that don't support GL 1.1 or EXT_vertex_arrays) or when an environment
     * variable is set.
     * 
     * \todo
     * GL 1.1 and EXT_vertex_arrays use identical protocol, but have different
     * opcodes for \c glDrawArrays.  For servers that advertise one or the
     * other, there should be a way to select which opcode to use.
     */
    GLboolean old_DrawArrays_possible;

    /**
     * Is it possible to use the new GL X.X / ARB_vertex_buffer_object
     * protocol?
     * 
     * \todo
     * This protocol has not yet been defined by the ARB, but is currently a
     * work in progress.  This field is a place-holder.
     */
    GLboolean new_DrawArrays_possible;

    /**
     * Active texture unit set by \c glClientActiveTexture.
     * 
     * \sa __glXGetActiveTextureUnit
     */
    unsigned active_texture_unit;
    
    /**
     * Number of supported texture units.  Even if ARB_multitexture /
     * GL 1.3 are not supported, this will be at least 1.  When multitexture
     * is supported, this will be the value queried by calling
     * \c glGetIntegerv with \c GL_MAX_TEXTURE_UNITS.
     * 
     * \todo
     * Investigate if this should be the value of \c GL_MAX_TEXTURE_COORDS
     * instead (if GL 2.0 / ARB_fragment_shader / ARB_fragment_program /
     * NV_fragment_program are supported).
     */
    unsigned num_texture_units;

    /**
     * Number of generic vertex program attribs.  If GL_ARB_vertex_program
     * is not supported, this will be zero.  Otherwise it will be the value
     * queries by calling \c glGetProgramiv with \c GL_VERTEX_PROGRAM_ARB
     * and \c GL_MAX_PROGRAM_ATTRIBS_ARB.
     */
    unsigned num_vertex_program_attribs;

    /**
     * \n Methods for implementing various GL functions.
     * 
     * These method pointers are only valid \c array_info_cache_valid is set.
     * When each function starts, it much check \c array_info_cache_valid.
     * If it is not set, it must call \c fill_array_info_cache and call
     * the new method.
     * 
     * \sa fill_array_info_cache
     * 
     * \todo
     * Write code to plug these functions directly into the dispatch table.
     */
    /*@{*/
    void (*DrawArrays)( GLenum, GLint, GLsizei );
    void (*DrawElements)( GLenum mode, GLsizei count, GLenum type,
			  const GLvoid *indices );
    /*@}*/

    struct array_stack_state * stack;
    unsigned active_texture_unit_stack[ __GL_CLIENT_ATTRIB_STACK_DEPTH ];
    unsigned stack_index;
};

#endif /* _INDIRECT_VA_PRIVATE_ */
