pack_bounds.c revision a0d1e40cc56a54314af0a1a4b5e13905ffd78393
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos/* Copyright (c) 2001, Stanford University
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * All rights reserved
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos *
088fa5d9eaa83bf4b3d59a64c0519f42a143aaa9Alin Brici * See the file LICENSE.txt for information on redistributing this software.
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos */
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos#include "packer.h"
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos#include "cr_opcodes.h"
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos#include "cr_mem.h"
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordosvoid PACK_APIENTRY crPackBoundsInfoCR( const CRrecti *bounds, const GLbyte *payload, GLint len, GLint num_opcodes )
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos{
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos GET_PACKER_CONTEXT(pc);
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos /* Don't get the buffered_ptr here because we've already
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * verified that there's enough space for everything. */
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos unsigned char *data_ptr = pc->buffer.data_current;
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos int len_aligned = ( len + 0x3 ) & ~0x3;
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos int total_len = 24 + len_aligned;
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos WRITE_DATA( 0, int, total_len );
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos WRITE_DATA( 4, int, bounds->x1 );
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos WRITE_DATA( 8, int, bounds->y1 );
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos WRITE_DATA( 12, int, bounds->x2 );
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos WRITE_DATA( 16, int, bounds->y2 );
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos WRITE_DATA( 20, int, num_opcodes );
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos /* skip the BOUNDSINFO */
088fa5d9eaa83bf4b3d59a64c0519f42a143aaa9Alin Brici data_ptr += 24;
a1f638677d6b70887a0eeeab4e30fd2d7dbb5e5eBrendan Mmiller
f277d0ee6abc01fba581c836571dc390ac349de8Brendan Miller /* put in padding opcodes (deliberately bogus) */
a1f638677d6b70887a0eeeab4e30fd2d7dbb5e5eBrendan Mmiller switch ( len_aligned - len )
e95ef6b1ae95c5684fc1b20063975a2cb29055b9Laszlo Hordos {
aa26d20912b59f80d1b06b9c0a34c2d4de507a4fLaszlo Hordos case 3: *data_ptr++ = 0xff; /* FALLTHROUGH */
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos case 2: *data_ptr++ = 0xff; /* FALLTHROUGH */
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos case 1: *data_ptr++ = 0xff; /* FALLTHROUGH */
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos default: break;
c32fc412b63ff49e61e7748fda8a3d2dab890813Laszlo Hordos }
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos crMemcpy( data_ptr, payload, len );
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos
22021f13de98c2ef69055bec833d200f16922bc2Laszlo Hordos WRITE_OPCODE( pc, CR_BOUNDSINFOCR_OPCODE );
d90caa300251d7fd09e3f286018ce04356a71e62Laszlo Hordos pc->buffer.data_current += 24 + len_aligned;
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos}
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos