/* Copyright (c) 2001, Stanford University
* All rights reserved
*
* See the file LICENSE.txt for information on redistributing this software.
*/
#include "packer.h"
#include "cr_opcodes.h"
#include "cr_error.h"
#include "iprt/types.h"
#define UNUSED(x) ((void)(x))
/**
* \mainpage Packer
*
* \section PackerIntroduction Introduction
*
* Chromium consists of all the top-level files in the cr
* directory. The packer module basically takes care of API dispatch,
* and OpenGL state management.
*
*/
void PACK_APIENTRY crPackVertexPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
{
/* Packing this command is only useful if we have server-side vertex
* arrays - GL_ARB_vertex_buffer_object. Note that pointer will really
* be an offset into a server-side buffer.
* @todo Because of that we'd only transfer lowest 32bit as there're no 4gb+VBOs (yet?).
* Look at glgets regarding max vertices in arrays.
*/
CR_GET_PACKER_CONTEXT(pc);
unsigned char *data_ptr;
int packet_length = 24;
CR_GET_BUFFERED_POINTER( pc, packet_length );
WRITE_DATA( 0, GLint, packet_length );
WRITE_DATA( 4, GLenum, CR_VERTEXPOINTER_EXTEND_OPCODE );
WRITE_DATA( 8, GLint, size );
WRITE_DATA( 12, GLenum, type );
WRITE_DATA( 16, GLsizei, stride );
WRITE_DATA( 20, GLuint, (GLuint) ((uintptr_t) pointer) );
WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
CR_UNLOCK_PACKER_CONTEXT(pc);
}
void PACK_APIENTRY crPackColorPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
{
CR_GET_PACKER_CONTEXT(pc);
unsigned char *data_ptr;
int packet_length = 24;
CR_GET_BUFFERED_POINTER( pc, packet_length );
WRITE_DATA( 0, GLint, packet_length );
WRITE_DATA( 4, GLenum, CR_COLORPOINTER_EXTEND_OPCODE );
WRITE_DATA( 8, GLint, size );
WRITE_DATA( 12, GLenum, type );
WRITE_DATA( 16, GLsizei, stride );
WRITE_DATA( 20, GLuint, (GLuint) ((uintptr_t) pointer) );
WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
CR_UNLOCK_PACKER_CONTEXT(pc);
}
void PACK_APIENTRY crPackNormalPointer( GLenum type, GLsizei stride, const GLvoid *pointer )
{
CR_GET_PACKER_CONTEXT(pc);
unsigned char *data_ptr;
int packet_length = 20;
CR_GET_BUFFERED_POINTER( pc, packet_length );
WRITE_DATA( 0, GLint, packet_length );
WRITE_DATA( 4, GLenum, CR_NORMALPOINTER_EXTEND_OPCODE );
WRITE_DATA( 8, GLenum, type );
WRITE_DATA( 12, GLsizei, stride );
WRITE_DATA( 16, GLuint, (GLuint) ((uintptr_t) pointer) );
WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
CR_UNLOCK_PACKER_CONTEXT(pc);
}
void PACK_APIENTRY crPackTexCoordPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
{
CR_GET_PACKER_CONTEXT(pc);
unsigned char *data_ptr;
int packet_length = 24;
CR_GET_BUFFERED_POINTER( pc, packet_length );
WRITE_DATA( 0, GLint, packet_length );
WRITE_DATA( 4, GLenum, CR_TEXCOORDPOINTER_EXTEND_OPCODE );
WRITE_DATA( 8, GLint, size );
WRITE_DATA( 12, GLenum, type );
WRITE_DATA( 16, GLsizei, stride );
WRITE_DATA( 20, GLuint, (GLuint) ((uintptr_t) pointer) );
WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
CR_UNLOCK_PACKER_CONTEXT(pc);
}
void PACK_APIENTRY crPackEdgeFlagPointer( GLsizei stride, const GLvoid *pointer )
{
CR_GET_PACKER_CONTEXT(pc);
unsigned char *data_ptr;
int packet_length = 16;
CR_GET_BUFFERED_POINTER( pc, packet_length );
WRITE_DATA( 0, GLint, packet_length );
WRITE_DATA( 4, GLenum, CR_EDGEFLAGPOINTER_EXTEND_OPCODE );
WRITE_DATA( 8, GLsizei, stride );
WRITE_DATA( 12, GLuint, (GLuint) ((uintptr_t) pointer) );
WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
CR_UNLOCK_PACKER_CONTEXT(pc);
}
void PACK_APIENTRY crPackIndexPointer( GLenum type, GLsizei stride, const GLvoid *pointer )
{
CR_GET_PACKER_CONTEXT(pc);
unsigned char *data_ptr;
int packet_length = 20;
CR_GET_BUFFERED_POINTER( pc, packet_length );
WRITE_DATA( 0, GLint, packet_length );
WRITE_DATA( 4, GLenum, CR_INDEXPOINTER_EXTEND_OPCODE );
WRITE_DATA( 8, GLenum, type );
WRITE_DATA( 12, GLsizei, stride );
WRITE_DATA( 16, GLuint, (GLuint) ((uintptr_t) pointer) );
WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
CR_UNLOCK_PACKER_CONTEXT(pc);
}
void PACK_APIENTRY crPackSecondaryColorPointerEXT( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
{
CR_GET_PACKER_CONTEXT(pc);
unsigned char *data_ptr;
int packet_length = 24;
CR_GET_BUFFERED_POINTER( pc, packet_length );
WRITE_DATA( 0, GLint, packet_length );
WRITE_DATA( 4, GLenum, CR_SECONDARYCOLORPOINTEREXT_EXTEND_OPCODE );
WRITE_DATA( 8, GLint, size );
WRITE_DATA( 12, GLenum, type );
WRITE_DATA( 16, GLsizei, stride );
WRITE_DATA( 20, GLuint, (GLuint) ((uintptr_t) pointer) );
WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
CR_UNLOCK_PACKER_CONTEXT(pc);
}
void PACK_APIENTRY crPackFogCoordPointerEXT( GLenum type, GLsizei stride, const GLvoid * pointer )
{
CR_GET_PACKER_CONTEXT(pc);
unsigned char *data_ptr;
int packet_length = 20;
CR_GET_BUFFERED_POINTER( pc, packet_length );
WRITE_DATA( 0, GLint, packet_length );
WRITE_DATA( 4, GLenum, CR_FOGCOORDPOINTEREXT_EXTEND_OPCODE );
WRITE_DATA( 8, GLenum, type );
WRITE_DATA( 12, GLsizei, stride );
WRITE_DATA( 16, GLuint, (GLuint) ((uintptr_t) pointer) );
WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
CR_UNLOCK_PACKER_CONTEXT(pc);
}
void PACK_APIENTRY crPackVertexAttribPointerARB( GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer )
{
CR_GET_PACKER_CONTEXT(pc);
unsigned char *data_ptr;
int packet_length = 32;
CR_GET_BUFFERED_POINTER( pc, packet_length );
WRITE_DATA( 0, GLint, packet_length );
WRITE_DATA( 4, GLenum, CR_VERTEXATTRIBPOINTERARB_EXTEND_OPCODE );
WRITE_DATA( 8, GLint, index );
WRITE_DATA( 12, GLint, size );
WRITE_DATA( 16, GLenum, type );
WRITE_DATA( 20, GLboolean, normalized );
WRITE_DATA( 24, GLsizei, stride );
WRITE_DATA( 28, GLuint, (GLuint) ((uintptr_t) pointer) );
WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
CR_UNLOCK_PACKER_CONTEXT(pc);
}
void PACK_APIENTRY crPackVertexAttribPointerNV( GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
{
CR_GET_PACKER_CONTEXT(pc);
unsigned char *data_ptr;
int packet_length = 28;
CR_GET_BUFFERED_POINTER( pc, packet_length );
WRITE_DATA( 0, GLint, packet_length );
WRITE_DATA( 4, GLenum, CR_VERTEXATTRIBPOINTERNV_EXTEND_OPCODE );
WRITE_DATA( 8, GLint, index );
WRITE_DATA( 12, GLint, size );
WRITE_DATA( 16, GLenum, type );
WRITE_DATA( 20, GLsizei, stride );
WRITE_DATA( 24, GLuint, (GLuint) ((uintptr_t) pointer) );
WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
CR_UNLOCK_PACKER_CONTEXT(pc);
}
void PACK_APIENTRY crPackInterleavedArrays( GLenum format, GLsizei stride, const GLvoid *pointer )
{
CR_GET_PACKER_CONTEXT(pc);
unsigned char *data_ptr;
int packet_length = 20;
CR_GET_BUFFERED_POINTER( pc, packet_length );
WRITE_DATA( 0, GLint, packet_length );
WRITE_DATA( 4, GLenum, CR_INTERLEAVEDARRAYS_EXTEND_OPCODE );
WRITE_DATA( 8, GLenum, format );
WRITE_DATA( 12, GLsizei, stride );
WRITE_DATA( 16, GLuint, (GLuint) ((uintptr_t) pointer) );
WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
CR_UNLOCK_PACKER_CONTEXT(pc);
}
void PACK_APIENTRY crPackVertexArrayRangeNV( GLsizei length, const GLvoid *pointer )
{
UNUSED( length );
UNUSED( pointer );
crWarning( "Unimplemented crPackVertexArrayRangeNV" );
}