brender-1997/s3/Plib.c
2022-05-03 14:31:40 -07:00

260 lines
6.5 KiB
C

/*
* Copyright (c) 1993-1995 Argonaut Technologies Limited. All rights reserved.
*
* $Id: plib.c 2.1 1996/03/15 17:24:59 sam Exp $
* $Locker: $
*
* Primitive library methods for S3
*
*/
#include <stddef.h>
#include <string.h>
#include <windows.h>
#include <ddraw.h>
#include "drv.h"
#include "shortcut.h"
#include "brassert.h"
BR_RCS_ID("$Id: plib.c 2.1 1996/03/15 17:24:59 sam Exp $");
/*
* Default dispatch table for primitive library (defined at end of file)
*/
static struct br_primitive_library_dispatch primitiveLibraryDispatch;
// Renderer active/inactive flag
extern br_boolean S3RendererInitialised;
/*
* 0 terminated list of tokens that are used to represent the state for
* this library
*/
br_token PrimPartsTokensS3[] = {
BRT_PRIMITIVE,
BRT_OUTPUT,
0
};
/*
* Primitive library info. template
*/
#define F(f) offsetof(br_primitive_library, f)
static struct br_tv_template_entry primitiveLibraryTemplateEntries[] = {
{BRT(IDENTIFIER_CSTR), F(identifier), BRTV_QUERY | BRTV_ALL, BRTV_CONV_COPY, },
{BRT(PARTS_TL), (size_t)&PrimPartsTokensS3, BRTV_QUERY | BRTV_ALL | BRTV_ABS, BRTV_CONV_LIST },
{BRT(PARTS_U32), MASK_STATE_CACHE | MASK_STATE_OUTPUT | MASK_STATE_PRIMITIVE, BRTV_QUERY | BRTV_ABS, BRTV_CONV_COPY },
#if DEBUG
{DEV(NO_CHANGES_B), F(no_changes), BRTV_QUERY | BRTV_ALL, BRTV_CONV_COPY},
#endif
};
#undef F
static struct br_tv_template primitiveLibraryTemplate = {
BR_ASIZE(primitiveLibraryTemplateEntries),
primitiveLibraryTemplateEntries
};
void ClearPlibTemplates(void)
{
CLEAR_TEMPLATE(primitiveLibrary);
}
/*
* Set up a static device object
*/
br_error PrimitiveLibraryHardS3Initialise(struct br_primitive_library * self, struct br_device *dev)
{
self->dispatch = &primitiveLibraryDispatch;
self->object_list = BrObjectListAllocate(DRIVER_RESOURCE);
ObjectContainerAddFront(dev,(br_object*)self);
return BRE_OK;
}
static void BR_CMETHOD_DECL(br_primitive_library_hardS3, free)(br_primitive_library *self)
{
ObjectContainerRemove(ObjectDevice(self),(br_object*)self);
BrObjectContainerFree((br_object_container*)self,BR_NULL_TOKEN,NULL,NULL);
}
static br_token BR_CMETHOD_DECL(br_primitive_library_hardS3, type)(br_primitive_library *self)
{
return BRT_PRIMITIVE_LIBRARY;
}
static br_boolean BR_CMETHOD_DECL(br_primitive_library_hardS3, isType)(br_primitive_library *self, br_token t)
{
return (t == BRT_PRIMITIVE_LIBRARY) || (t == BRT_OBJECT_CONTAINER) || (t == BRT_OBJECT);
}
static br_int_32 BR_CMETHOD_DECL(br_primitive_library_hardS3, space)(br_primitive_library *self)
{
return sizeof(br_primitive_library);
}
static struct br_tv_template * BR_CMETHOD_DECL(br_primitive_library_hardS3,templateQuery)
(br_primitive_library *self)
{
primitiveLibraryTemplate.res = DRIVER_RESOURCE;
return &primitiveLibraryTemplate;
}
static void * BR_CMETHOD_DECL(br_primitive_library_hardS3,listQuery)(br_primitive_library *self)
{
return self->object_list;
}
static br_error BR_CMETHOD_DECL(br_primitive_library_hardS3, stateNew)(
struct br_primitive_library *self,
struct br_primitive_state **rps)
{
struct br_primitive_state *ps;
UASSERT(rps);
ps = PrimitiveStateHardS3Allocate(self);
if(ps == NULL)
return BRE_FAIL;
*rps = ps;
return BRE_OK;
}
static br_error BR_CMETHOD_DECL(br_primitive_library_hardS3, bufferStoredNew)
(struct br_primitive_library *self, struct br_buffer_stored **psm,
br_token use, struct br_device_pixelmap *pm, br_token_value *tv)
{
struct br_buffer_stored *sm;
UASSERT(psm);
sm = BufferStoredHardS3Allocate(self, use, pm ,tv);
if(sm == NULL)
return BRE_FAIL;
*psm = sm;
return BRE_OK;
}
static br_error BR_CMETHOD_DECL(br_primitive_library_hardS3, bufferStoredAvail)(
struct br_primitive_library *self,
br_int_32 *space,
br_token use,
br_token_value *tv)
{
/*
* Should return free system memory
*/
return BRE_FAIL;
}
/* Called at the end of rendering */
static br_error BR_CMETHOD_DECL(br_primitive_library_hardS3, flush)(
struct br_primitive_library *self,
br_boolean wait)
{
// Reset current buffer pointers so we will update the output buffers
// when we begin a new render
extern br_device_pixelmap *last_depth;
extern br_device_pixelmap *last_colour;
extern struct br_buffer_stored *current_tb;
last_depth = NULL;
last_colour = NULL;
current_tb = NULL;
return BRE_OK;
}
static br_error BR_CMETHOD_DECL(br_primitive_library_hardS3, synchronise)(
struct br_primitive_library *self,
br_token sync_type,
br_boolean block)
{
/*
* Never buffers any work so no need to synchronise
*/
return BRE_OK;
}
static br_error BR_CMETHOD_DECL(br_primitive_library_hardS3, mask)(
struct br_primitive_library *self,
br_uint_32 *mask,
br_token *parts,
int n_parts)
{
int i;
br_uint_32 m = 0;
for(i=0; i < n_parts; i++) {
switch(parts[i]) {
case BRT_PRIMITIVE:
m |= MASK_STATE_PRIMITIVE;
break;
case BRT_OUTPUT:
m |= MASK_STATE_OUTPUT;
break;
}
}
*mask = m;
return BRE_OK;
}
/*
* Default dispatch table for device
*/
static struct br_primitive_library_dispatch primitiveLibraryDispatch = {
NULL,NULL,NULL,NULL,
BR_CMETHOD_REF(br_primitive_library_hardS3, free),
BR_CMETHOD_REF(br_object_s3, identifier),
BR_CMETHOD_REF(br_primitive_library_hardS3, type),
BR_CMETHOD_REF(br_primitive_library_hardS3, isType),
BR_CMETHOD_REF(br_object_s3, device),
BR_CMETHOD_REF(br_primitive_library_hardS3, space),
BR_CMETHOD_REF(br_primitive_library_hardS3, templateQuery),
BR_CMETHOD_REF(br_object, query),
BR_CMETHOD_REF(br_object, queryBuffer),
BR_CMETHOD_REF(br_object, queryMany),
BR_CMETHOD_REF(br_object, queryManySize),
BR_CMETHOD_REF(br_object, queryAll),
BR_CMETHOD_REF(br_object, queryAllSize),
BR_CMETHOD_REF(br_primitive_library_hardS3, listQuery),
BR_CMETHOD_REF(br_object_container, tokensMatchBegin),
BR_CMETHOD_REF(br_object_container, tokensMatch),
BR_CMETHOD_REF(br_object_container, tokensMatchEnd),
BR_CMETHOD_REF(br_object_container, addFront),
BR_CMETHOD_REF(br_object_container, removeFront),
BR_CMETHOD_REF(br_object_container, remove),
BR_CMETHOD_REF(br_object_container, find),
BR_CMETHOD_REF(br_object_container, findMany),
BR_CMETHOD_REF(br_object_container, count),
BR_CMETHOD_REF(br_primitive_library_hardS3, stateNew),
BR_CMETHOD_REF(br_primitive_library_hardS3, bufferStoredNew),
BR_CMETHOD_REF(br_primitive_library_hardS3, bufferStoredAvail),
BR_CMETHOD_REF(br_primitive_library_hardS3, flush),
BR_CMETHOD_REF(br_primitive_library_hardS3, synchronise),
BR_CMETHOD_REF(br_primitive_library_hardS3, mask),
};