renderspu.c revision bf51ba1739a9eb4abd3bbf2fbeda16c90cdd2c19
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/* Copyright (c) 2001, Stanford University
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * All rights reserved
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync *
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * See the file LICENSE.txt for information on redistributing this software.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#include "cr_environment.h"
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#include "cr_string.h"
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#include "cr_error.h"
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#include "cr_mem.h"
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#include "cr_spu.h"
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#include "cr_environment.h"
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#include "renderspu.h"
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#include "cr_extstring.h"
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncDoSync(void)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRMessage *in, out;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync out.header.type = CR_MESSAGE_OOB;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (render_spu.is_swap_master)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync int a;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync for (a = 0; a < render_spu.num_swap_clients; a++)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crNetGetMessage( render_spu.swap_conns[a], &in );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crNetFree( render_spu.swap_conns[a], in);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync for (a = 0; a < render_spu.num_swap_clients; a++)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crNetSend( render_spu.swap_conns[a], NULL, &out, sizeof(CRMessage));
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crNetSend( render_spu.swap_conns[0], NULL, &out, sizeof(CRMessage));
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crNetGetMessage( render_spu.swap_conns[0], &in );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crNetFree( render_spu.swap_conns[0], in);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/*
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Visual functions
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/**
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * used for debugging and giving info to the user.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncvoid
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncrenderspuMakeVisString( GLbitfield visAttribs, char *s )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync s[0] = 0;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (visAttribs & CR_RGB_BIT)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crStrcat(s, "RGB");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (visAttribs & CR_ALPHA_BIT)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crStrcat(s, "A");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (visAttribs & CR_DOUBLE_BIT)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crStrcat(s, ", Doublebuffer");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (visAttribs & CR_STEREO_BIT)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crStrcat(s, ", Stereo");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (visAttribs & CR_DEPTH_BIT)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crStrcat(s, ", Z");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (visAttribs & CR_STENCIL_BIT)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crStrcat(s, ", Stencil");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (visAttribs & CR_ACCUM_BIT)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crStrcat(s, ", Accum");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (visAttribs & CR_MULTISAMPLE_BIT)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crStrcat(s, ", Multisample");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (visAttribs & CR_OVERLAY_BIT)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crStrcat(s, ", Overlay");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (visAttribs & CR_PBUFFER_BIT)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crStrcat(s, ", PBuffer");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncGLboolean renderspuInitVisual(VisualInfo *pVisInfo, const char *displayName, GLbitfield visAttribs)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pVisInfo->displayName = crStrdup(displayName);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pVisInfo->visAttribs = visAttribs;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return renderspu_SystemInitVisual(pVisInfo);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/*
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Find a VisualInfo which matches the given display name and attribute
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * bitmask, or return a pointer to a new visual.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncVisualInfo *
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncrenderspuFindVisual(const char *displayName, GLbitfield visAttribs)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync int i;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!displayName)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync displayName = "";
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* first, try to find a match */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#if defined(WINDOWS) || defined(DARWIN)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync for (i = 0; i < render_spu.numVisuals; i++) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (visAttribs == render_spu.visuals[i].visAttribs) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return &(render_spu.visuals[i]);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#elif defined(GLX)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync for (i = 0; i < render_spu.numVisuals; i++) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (crStrcmp(displayName, render_spu.visuals[i].displayName) == 0
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync && visAttribs == render_spu.visuals[i].visAttribs) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return &(render_spu.visuals[i]);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#endif
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (render_spu.numVisuals >= MAX_VISUALS)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("Render SPU: Couldn't create a visual, too many visuals already");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* create a new visual */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync i = render_spu.numVisuals;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (renderspuInitVisual(&(render_spu.visuals[i]), displayName, visAttribs)) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.numVisuals++;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return &(render_spu.visuals[i]);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("Render SPU: Couldn't get a visual, renderspu_SystemInitVisual failed");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic ContextInfo * renderspuCreateContextInternal(const char *dpyName, GLint visBits, GLint idCtx, ContextInfo * sharedContext)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ContextInfo *context;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync VisualInfo *visual;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (idCtx <= 0)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync idCtx = (GLint)crHashtableAllocKeys(render_spu.contextTable, 1);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (idCtx <= 0)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("failed to allocate context id");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (crHashtableIsKeyUsed(render_spu.contextTable, idCtx))
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("the specified ctx key %d is in use", idCtx);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!dpyName || crStrlen(render_spu.display_string)>0)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync dpyName = render_spu.display_string;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync visual = renderspuFindVisual(dpyName, visBits);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!visual)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync context = (ContextInfo *) crCalloc(sizeof(ContextInfo));
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!context)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync context->BltInfo.Base.id = idCtx;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync context->shared = sharedContext;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!renderspu_SystemCreateContext(visual, context, sharedContext))
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crHashtableAdd(render_spu.contextTable, idCtx, context);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync context->BltInfo.Base.visualBits = visual->visAttribs;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /*
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crDebug("Render SPU: CreateContext(%s, 0x%x) returning %d",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync dpyName, visBits, context->BltInfo.Base.id);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return context;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncGLint renderspuCreateContextEx(const char *dpyName, GLint visBits, GLint id, GLint shareCtx)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ContextInfo *context, *sharedContext = NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (shareCtx) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync sharedContext
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync = (ContextInfo *) crHashtableSearch(render_spu.contextTable, shareCtx);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(sharedContext);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync context = renderspuCreateContextInternal(dpyName, visBits, id, sharedContext);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (context)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return context->BltInfo.Base.id;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return -1;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/*
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Context functions
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncGLint RENDER_APIENTRY
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncrenderspuCreateContext(const char *dpyName, GLint visBits, GLint shareCtx)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return renderspuCreateContextEx(dpyName, visBits, 0, shareCtx);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void RENDER_APIENTRY
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncrenderspuDestroyContext( GLint ctx )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ContextInfo *context, *curCtx;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(ctx);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (ctx == CR_RENDER_DEFAULT_CONTEXT_ID)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("request to destroy a default context, ignoring");
10258d88c40d8254a2a0d89e9b6c1f3b487f5c2dvboxsync return;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync context = (ContextInfo *) crHashtableSearch(render_spu.contextTable, ctx);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(context);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync curCtx = GET_CONTEXT_VAL();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(curCtx);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (curCtx == context)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
10258d88c40d8254a2a0d89e9b6c1f3b487f5c2dvboxsync renderspuMakeCurrent( CR_RENDER_DEFAULT_WINDOW_ID, 0, CR_RENDER_DEFAULT_CONTEXT_ID );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync curCtx = GET_CONTEXT_VAL();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync Assert(curCtx);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync Assert(curCtx != context);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
10258d88c40d8254a2a0d89e9b6c1f3b487f5c2dvboxsync renderspu_SystemDestroyContext( context );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (context->extensionString) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crFree(context->extensionString);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync context->extensionString = NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crHashtableDelete(render_spu.contextTable, ctx, crFree);
10258d88c40d8254a2a0d89e9b6c1f3b487f5c2dvboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncvoid RENDER_APIENTRY
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncrenderspuMakeCurrent(GLint crWindow, GLint nativeWindow, GLint ctx)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
10258d88c40d8254a2a0d89e9b6c1f3b487f5c2dvboxsync WindowInfo *window;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ContextInfo *context;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /*
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crDebug("%s win=%d native=0x%x ctx=%d", __FUNCTION__, crWindow, (int) nativeWindow, ctx);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
10258d88c40d8254a2a0d89e9b6c1f3b487f5c2dvboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window = (WindowInfo *) crHashtableSearch(render_spu.windowTable, crWindow);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync context = (ContextInfo *) crHashtableSearch(render_spu.contextTable, ctx);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (window && context)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
10258d88c40d8254a2a0d89e9b6c1f3b487f5c2dvboxsync#ifdef CHROMIUM_THREADSAFE
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crSetTSD(&_RenderTSD, context);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#else
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.currentContext = context;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#endif
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync context->currentWindow = window;
10258d88c40d8254a2a0d89e9b6c1f3b487f5c2dvboxsync if (!window)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crDebug("Render SPU: MakeCurrent invalid window id: %d", crWindow);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!context)
10258d88c40d8254a2a0d89e9b6c1f3b487f5c2dvboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crDebug("Render SPU: MakeCurrent invalid context id: %d", ctx);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspu_SystemMakeCurrent( window, nativeWindow, context );
10258d88c40d8254a2a0d89e9b6c1f3b487f5c2dvboxsync if (!context->everCurrent) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* print OpenGL info */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync const char *extString = (const char *) render_spu.ws.glGetString( GL_EXTENSIONS );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /*
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crDebug( "Render SPU: GL_EXTENSIONS: %s", render_spu.ws.glGetString( GL_EXTENSIONS ) );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
10258d88c40d8254a2a0d89e9b6c1f3b487f5c2dvboxsync crInfo( "Render SPU: GL_VENDOR: %s", render_spu.ws.glGetString( GL_VENDOR ) );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crInfo( "Render SPU: GL_RENDERER: %s", render_spu.ws.glGetString( GL_RENDERER ) );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crInfo( "Render SPU: GL_VERSION: %s", render_spu.ws.glGetString( GL_VERSION ) );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crInfo( "Render SPU: GL_EXTENSIONS: %s", render_spu.ws.glGetString( GL_EXTENSIONS ) );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (crStrstr(extString, "GL_ARB_window_pos"))
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync context->haveWindowPosARB = GL_TRUE;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync context->haveWindowPosARB = GL_FALSE;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync context->everCurrent = GL_TRUE;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (crWindow == CR_RENDER_DEFAULT_WINDOW_ID && window->mapPending &&
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync !render_spu.render_to_app_window && !render_spu.render_to_crut_window) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* Window[CR_RENDER_DEFAULT_CONTEXT_ID] is special, it's the default window and normally hidden.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * If the mapPending flag is set, then we should now make the window
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * visible.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /*renderspu_SystemShowWindow( window, GL_TRUE );*/
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window->mapPending = GL_FALSE;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window->everCurrent = GL_TRUE;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else if (!crWindow && !ctx)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#ifdef CHROMIUM_THREADSAFE
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crSetTSD(&_RenderTSD, NULL);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#else
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.currentContext = NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#endif
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspu_SystemMakeCurrent( NULL, 0, NULL );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crError("renderspuMakeCurrent invalid ids: crWindow(%d), ctx(%d)", crWindow, ctx);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncGLboolean renderspuWindowInit( WindowInfo *window, VisualInfo *visual, GLboolean showIt, GLint id )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync RTCritSectInit(&window->CompositorLock);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window->pCompositor = NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window->BltInfo.Base.id = id;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window->x = render_spu.defaultX;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window->y = render_spu.defaultY;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window->BltInfo.width = render_spu.defaultWidth;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window->BltInfo.height = render_spu.defaultHeight;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* Set window->title, replacing %i with the window ID number */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync const char *s = crStrstr(render_spu.window_title, "%i");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (s) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync int i, j, k;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window->title = crAlloc(crStrlen(render_spu.window_title) + 10);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync for (i = 0; render_spu.window_title[i] != '%'; i++)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window->title[i] = render_spu.window_title[i];
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync k = sprintf(window->title + i, "%d", window->BltInfo.Base.id);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(k < 10);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync i++; /* skip the 'i' after the '%' */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync j = i + k;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync for (; (window->title[j] = s[i]) != 0; i++, j++)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window->title = crStrdup(render_spu.window_title);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window->BltInfo.Base.visualBits = visual->visAttribs;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /*
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crDebug("Render SPU: Creating window (visBits=0x%x, id=%d)", visBits, window->BltInfo.Base.id);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* Have GLX/WGL/AGL create the window */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!renderspu_SystemVBoxCreateWindow( visual, showIt, window ))
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning( "Render SPU: Couldn't create a window, renderspu_SystemCreateWindow failed" );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return GL_FALSE;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(window->visual == visual);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return GL_TRUE;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/*
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Window functions
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncGLint renderspuWindowCreateEx( const char *dpyName, GLint visBits, GLint id )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync WindowInfo *window;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync VisualInfo *visual;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync GLboolean showIt;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (id <= 0)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync id = (GLint)crHashtableAllocKeys(render_spu.windowTable, 1);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (id <= 0)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("failed to allocate window id");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return -1;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (crHashtableIsKeyUsed(render_spu.windowTable, id))
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("the specified window key %d is in use", id);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return -1;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!dpyName || crStrlen(render_spu.display_string) > 0)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync dpyName = render_spu.display_string;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync visual = renderspuFindVisual( dpyName, visBits );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!visual)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning( "Render SPU: Couldn't create a window, renderspuFindVisual returned NULL" );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return -1;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* Allocate WindowInfo */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window = (WindowInfo *) crCalloc(sizeof(WindowInfo));
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!window)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning( "Render SPU: Couldn't create a window" );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return -1;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crHashtableAdd(render_spu.windowTable, id, window);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (render_spu.force_hidden_wdn_create
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync || ((render_spu.render_to_app_window || render_spu.render_to_crut_window) && !crGetenv("CRNEWSERVER")))
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync showIt = 0;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync showIt = (id != CR_RENDER_DEFAULT_WINDOW_ID);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /*
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crDebug("Render SPU: Creating window (visBits=0x%x, id=%d)", visBits, window->BltInfo.Base.id);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* Have GLX/WGL/AGL create the window */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!renderspuWindowInit( window, visual, showIt, id ))
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crFree(window);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning( "Render SPU: Couldn't create a window, renderspu_SystemCreateWindow failed" );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return -1;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return window->BltInfo.Base.id;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncGLint RENDER_APIENTRY
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncrenderspuWindowCreate( const char *dpyName, GLint visBits )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return renderspuWindowCreateEx( dpyName, visBits, 0 );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void renderspuCheckCurrentCtxWindowCB(unsigned long key, void *data1, void *data2)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ContextInfo *pCtx = (ContextInfo *) data1;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync WindowInfo *pWindow = data2;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync (void) key;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (pCtx->currentWindow==pWindow)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspuMakeCurrent(CR_RENDER_DEFAULT_WINDOW_ID, 0, pCtx->BltInfo.Base.id);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pCtx->currentWindow=0;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncvoid renderspuWindowTerm( WindowInfo *window )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync GET_CONTEXT(pOldCtx);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* ensure no concurrent draws can take place */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspuVBoxCompositorSet(window, NULL);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspu_SystemDestroyWindow( window );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync RTCritSectDelete(&window->CompositorLock);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* check if this window is bound to some ctx. Note: window pointer is already freed here */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crHashtableWalk(render_spu.contextTable, renderspuCheckCurrentCtxWindowCB, window);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* restore current context */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync GET_CONTEXT(pNewCtx);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (pNewCtx!=pOldCtx)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspuMakeCurrent(pOldCtx&&pOldCtx->currentWindow ? pOldCtx->currentWindow->BltInfo.Base.id:CR_RENDER_DEFAULT_WINDOW_ID, 0,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pOldCtx ? pOldCtx->BltInfo.Base.id:CR_RENDER_DEFAULT_CONTEXT_ID);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncvoid
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncRENDER_APIENTRY renderspuWindowDestroy( GLint win )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync WindowInfo *window;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(win >= 0);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (win == CR_RENDER_DEFAULT_WINDOW_ID)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("request to destroy a default mural, ignoring");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window = (WindowInfo *) crHashtableSearch(render_spu.windowTable, win);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (window) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crDebug("Render SPU: Destroy window (%d)", win);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspuWindowTerm( window );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* remove window info from hash table, and free it */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crHashtableDelete(render_spu.windowTable, win, crFree);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crDebug("Render SPU: Attempt to destroy invalid window (%d)", win);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void RENDER_APIENTRY
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncrenderspuWindowSize( GLint win, GLint w, GLint h )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync WindowInfo *window;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(win >= 0);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window = (WindowInfo *) crHashtableSearch(render_spu.windowTable, win);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (window) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (w != window->BltInfo.width
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync || h != window->BltInfo.height)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* window is resized, compositor data is no longer valid
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * this set also ensures all redraw operations are done in the redraw thread
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * and that no redraw is started until new Present request comes containing a valid presentation data */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspuVBoxCompositorSet( window, NULL);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspu_SystemWindowSize( window, w, h );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window->BltInfo.width = w;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window->BltInfo.height = h;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crDebug("Render SPU: Attempt to resize invalid window (%d)", win);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void RENDER_APIENTRY
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncrenderspuWindowPosition( GLint win, GLint x, GLint y )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!render_spu.ignore_window_moves) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync WindowInfo *window;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(win >= 0);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window = (WindowInfo *) crHashtableSearch(render_spu.windowTable, win);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (window) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspu_SystemWindowPosition( window, x, y );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window->x = x;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window->y = y;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crDebug("Render SPU: Attempt to move invalid window (%d)", win);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void RENDER_APIENTRY
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncrenderspuWindowVisibleRegion(GLint win, GLint cRects, GLint *pRects)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync WindowInfo *window;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(win >= 0);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window = (WindowInfo *) crHashtableSearch(render_spu.windowTable, win);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (window) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspu_SystemWindowVisibleRegion( window, cRects, pRects );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crDebug("Render SPU: Attempt to set VisibleRegion for invalid window (%d)", win);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void RENDER_APIENTRY
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncrenderspuWindowShow( GLint win, GLint flag )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync WindowInfo *window;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(win >= 0);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window = (WindowInfo *) crHashtableSearch(render_spu.windowTable, win);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (window) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (window->nativeWindow) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* We're rendering back to the native app window instead of the
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * new window which we (the Render SPU) created earlier.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * So, we never want to show the Render SPU's window.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync flag = 0;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspu_SystemShowWindow( window, (GLboolean) flag );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crDebug("Render SPU: Attempt to hide/show invalid window (%d)", win);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void RENDER_APIENTRY
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncrenderspuVBoxPresentComposition( GLint win, struct VBOXVR_SCR_COMPOSITOR * pCompositor, struct VBOXVR_SCR_COMPOSITOR_ENTRY *pChangedEntry )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync WindowInfo *window;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(win >= 0);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window = (WindowInfo *) crHashtableSearch(render_spu.windowTable, win);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (window) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspuVBoxCompositorSet( window, pCompositor);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (pCompositor)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspu_SystemVBoxPresentComposition(window, pCompositor, pChangedEntry);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crDebug("Render SPU: Attempt to PresentComposition for invalid window (%d)", win);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncvoid renderspuVBoxCompositorBlitStretched ( struct VBOXVR_SCR_COMPOSITOR * pCompositor, PCR_BLITTER pBlitter, GLfloat scaleX, GLfloat scaleY)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync VBOXVR_SCR_COMPOSITOR_ITERATOR CIter;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CrVrScrCompositorIterInit(pCompositor, &CIter);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync while ((pEntry = CrVrScrCompositorIterNext(&CIter)) != NULL)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync uint32_t cRegions;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync const RTRECT *paSrcRegions, *paDstRegions;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync int rc = CrVrScrCompositorEntryRegionsGet(pCompositor, pEntry, &cRegions, &paSrcRegions, &paDstRegions);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (RT_SUCCESS(rc))
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync uint32_t i;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync for (i = 0; i < pEntry->cRects; ++i)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync RTRECT DstRect;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync DstRect.xLeft = paDstRegions[i].xLeft * scaleX;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync DstRect.yTop = paDstRegions[i].yTop * scaleY;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync DstRect.xRight = paDstRegions[i].xRight * scaleX;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync DstRect.yBottom = paDstRegions[i].yBottom * scaleY;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CrBltBlitTexMural(pBlitter, &pEntry->Tex, &paSrcRegions[i], &DstRect, 1, CRBLT_F_LINEAR);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("BlitStretched: CrVrScrCompositorEntryRegionsGet failed rc %d", rc);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncvoid renderspuVBoxCompositorBlit ( struct VBOXVR_SCR_COMPOSITOR * pCompositor, PCR_BLITTER pBlitter)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync VBOXVR_SCR_COMPOSITOR_ITERATOR CIter;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CrVrScrCompositorIterInit(pCompositor, &CIter);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync while ((pEntry = CrVrScrCompositorIterNext(&CIter)) != NULL)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync uint32_t cRegions;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync const RTRECT *paSrcRegions, *paDstRegions;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync int rc = CrVrScrCompositorEntryRegionsGet(pCompositor, pEntry, &cRegions, &paSrcRegions, &paDstRegions);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (RT_SUCCESS(rc))
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CrBltBlitTexMural(pBlitter, &pEntry->Tex, paSrcRegions, paDstRegions, cRegions, CRBLT_F_LINEAR);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("Blit: CrVrScrCompositorEntryRegionsGet failed rc %d", rc);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncPCR_BLITTER renderspuVBoxPresentBlitterGet( WindowInfo *window )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PCR_BLITTER pBlitter = window->pBlitter;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!pBlitter)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (render_spu.blitterTable)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crHashtableLock(render_spu.blitterTable);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pBlitter = (PCR_BLITTER)crHashtableSearch(render_spu.blitterTable, window->visual->visAttribs);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!pBlitter)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync int rc;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CR_BLITTER_CONTEXT ctx;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pBlitter = (PCR_BLITTER)crCalloc(sizeof (*pBlitter));
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!pBlitter)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("failed to allocate blitter");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* @todo: this is the assumption that crserverlib uses context 1 as a default one
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * need to do it in a more proper way */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ctx.Base.id = 1;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ctx.Base.visualBits = window->visual->visAttribs;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync rc = CrBltInit(pBlitter, &ctx, true, render_spu.blitterDispatch);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!RT_SUCCESS(rc))
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("CrBltInit failed, rc %d", rc);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crFree(pBlitter);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (render_spu.blitterTable)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crHashtableAdd( render_spu.blitterTable, window->visual->visAttribs, pBlitter );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (render_spu.blitterTable)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crHashtableUnlock(render_spu.blitterTable);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync Assert(pBlitter);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window->pBlitter = pBlitter;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CrBltMuralSetCurrent(pBlitter, &window->BltInfo);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return pBlitter;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncint renderspuVBoxPresentBlitterEnter( PCR_BLITTER pBlitter )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync int rc;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PCR_BLITTER_CONTEXT pCtxInfo = NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PCR_BLITTER_WINDOW pWindowInfo = NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync GET_CONTEXT(pCtx);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (pCtx)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (pCtx->currentWindow)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pCtxInfo = &pCtx->BltInfo;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pWindowInfo = &pCtx->currentWindow->BltInfo;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync rc = CrBltEnter(pBlitter, pCtxInfo, pWindowInfo);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!RT_SUCCESS(rc))
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("CrBltEnter failed, rc %d", rc);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return rc;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return VINF_SUCCESS;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncPCR_BLITTER renderspuVBoxPresentBlitterGetAndEnter( WindowInfo *window )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PCR_BLITTER pBlitter = renderspuVBoxPresentBlitterGet(window);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (pBlitter)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync int rc = renderspuVBoxPresentBlitterEnter(pBlitter);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (RT_SUCCESS(rc))
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return pBlitter;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncPCR_BLITTER renderspuVBoxPresentBlitterEnsureCreated( WindowInfo *window )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!window->pBlitter)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync struct VBOXVR_SCR_COMPOSITOR * pTmpCompositor;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* just use compositor lock to synchronize */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pTmpCompositor = renderspuVBoxCompositorAcquire(window);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(pTmpCompositor);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (pTmpCompositor)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PCR_BLITTER pBlitter = renderspuVBoxPresentBlitterGet( window );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (pBlitter)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!CrBltIsEverEntered(pBlitter))
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync int rc = renderspuVBoxPresentBlitterEnter(pBlitter);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (RT_SUCCESS(rc))
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CrBltLeave(pBlitter);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("renderspuVBoxPresentBlitterEnter failed rc %d", rc);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("renderspuVBoxPresentBlitterGet failed");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspuVBoxCompositorRelease(window);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("renderspuVBoxCompositorAcquire failed");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return window->pBlitter;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncvoid renderspuVBoxPresentCompositionGeneric( WindowInfo *window, struct VBOXVR_SCR_COMPOSITOR * pCompositor, struct VBOXVR_SCR_COMPOSITOR_ENTRY *pChangedEntry )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PCR_BLITTER pBlitter = renderspuVBoxPresentBlitterGetAndEnter(window);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!pBlitter)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspuVBoxCompositorBlit(pCompositor, pBlitter);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspu_SystemSwapBuffers(window, 0);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CrBltLeave(pBlitter);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncvoid renderspuVBoxCompositorSet( WindowInfo *window, struct VBOXVR_SCR_COMPOSITOR * pCompositor)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync int rc;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* renderspuVBoxCompositorSet can be invoked from the chromium thread only and is not reentrant,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * no need to synch here
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * the lock is actually needed to ensure we're in synch with the redraw thread */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (window->pCompositor == pCompositor)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync rc = RTCritSectEnter(&window->CompositorLock);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (RT_SUCCESS(rc))
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window->pCompositor = pCompositor;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync RTCritSectLeave(&window->CompositorLock);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("RTCritSectEnter failed rc %d", rc);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void renderspuVBoxCompositorClearAllCB(unsigned long key, void *data1, void *data2)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync WindowInfo *window = (WindowInfo *) data1;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspuVBoxCompositorSet(window, NULL);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncvoid renderspuVBoxCompositorClearAll()
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* we need to clear window compositor, which is not that trivial though,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * since the lock order used in presentation thread is compositor lock() -> hash table lock (aquired for id->window resolution)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * this is why, to prevent potential deadlocks, we use crHashtableWalkUnlocked that does not hold the table lock
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * we are can be sure noone will modify the table here since renderspuVBoxCompositorClearAll can be called in the command (hgcm) thread only,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * and the table can be modified from that thread only as well */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crHashtableWalkUnlocked(render_spu.windowTable, renderspuVBoxCompositorClearAllCB, NULL);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstruct VBOXVR_SCR_COMPOSITOR * renderspuVBoxCompositorAcquire( WindowInfo *window)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync int rc = RTCritSectEnter(&window->CompositorLock);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (RT_SUCCESS(rc))
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync VBOXVR_SCR_COMPOSITOR * pCompositor = window->pCompositor;
204c6779704e15c023bd6eda2d955be06bc486bevboxsync if (pCompositor)
204c6779704e15c023bd6eda2d955be06bc486bevboxsync return pCompositor;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* if no compositor is set, release the lock and return */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync RTCritSectLeave(&window->CompositorLock);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("RTCritSectEnter failed rc %d", rc);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7b2cd67e9d38011fddd62967b7e9d26d88a28133vboxsyncint renderspuVBoxCompositorTryAcquire(WindowInfo *window, struct VBOXVR_SCR_COMPOSITOR **ppCompositor)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync int rc = RTCritSectTryEnter(&window->CompositorLock);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (RT_SUCCESS(rc))
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync *ppCompositor = window->pCompositor;
204c6779704e15c023bd6eda2d955be06bc486bevboxsync if (*ppCompositor)
7b2cd67e9d38011fddd62967b7e9d26d88a28133vboxsync return VINF_SUCCESS;
204c6779704e15c023bd6eda2d955be06bc486bevboxsync
7b2cd67e9d38011fddd62967b7e9d26d88a28133vboxsync /* if no compositor is set, release the lock and return */
204c6779704e15c023bd6eda2d955be06bc486bevboxsync RTCritSectLeave(&window->CompositorLock);
204c6779704e15c023bd6eda2d955be06bc486bevboxsync rc = VERR_INVALID_STATE;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync *ppCompositor = NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return rc;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncvoid renderspuVBoxCompositorRelease( WindowInfo *window)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync int rc;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync Assert(window->pCompositor);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync rc = RTCritSectLeave(&window->CompositorLock);
7a26bb8055882cf73ea492e915d08f112dd25aa1vboxsync if (!RT_SUCCESS(rc))
7b2cd67e9d38011fddd62967b7e9d26d88a28133vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("RTCritSectLeave failed rc %d", rc);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/*
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Set the current raster position to the given window coordinate.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncSetRasterPos( GLint winX, GLint winY )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync GLfloat fx, fy;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* Push current matrix mode and viewport attributes */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.PushAttrib( GL_TRANSFORM_BIT | GL_VIEWPORT_BIT );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* Setup projection parameters */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.MatrixMode( GL_PROJECTION );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.PushMatrix();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.LoadIdentity();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.MatrixMode( GL_MODELVIEW );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.PushMatrix();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.LoadIdentity();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.Viewport( winX - 1, winY - 1, 2, 2 );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* set the raster (window) position */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* huh ? */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync fx = (GLfloat) (winX - (int) winX);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync fy = (GLfloat) (winY - (int) winY);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.RasterPos4f( fx, fy, 0.0, 1.0 );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* restore matrices, viewport and matrix mode */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.PopMatrix();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.MatrixMode( GL_PROJECTION );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.PopMatrix();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.PopAttrib();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/*
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Draw the mouse pointer bitmap at (x,y) in window coords.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void DrawCursor( GLint x, GLint y )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#define POINTER_WIDTH 32
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#define POINTER_HEIGHT 32
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* Somebody artistic could probably do better here */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync static const char *pointerImage[POINTER_HEIGHT] =
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "XX..............................",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "XXXX............................",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ".XXXXX..........................",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ".XXXXXXX........................",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "..XXXXXXXX......................",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "..XXXXXXXXXX....................",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "...XXXXXXXXXXX..................",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "...XXXXXXXXXXXXX................",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "....XXXXXXXXXXXXXX..............",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "....XXXXXXXXXXXXXXXX............",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ".....XXXXXXXXXXXXXXXXX..........",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ".....XXXXXXXXXXXXXXXXXXX........",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "......XXXXXXXXXXXXXXXXXXXX......",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "......XXXXXXXXXXXXXXXXXXXXXX....",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ".......XXXXXXXXXXXXXXXXXXXXXXX..",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ".......XXXXXXXXXXXXXXXXXXXXXXXX.",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "........XXXXXXXXXXXXX...........",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "........XXXXXXXX.XXXXX..........",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ".........XXXXXX...XXXXX.........",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ".........XXXXX.....XXXXX........",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "..........XXX.......XXXXX.......",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "..........XX.........XXXXX......",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "......................XXXXX.....",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ".......................XXXXX....",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "........................XXX.....",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ".........................X......",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "................................",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "................................",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "................................",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "................................",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "................................",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "................................"
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync };
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync static GLubyte pointerBitmap[POINTER_HEIGHT][POINTER_WIDTH / 8];
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync static GLboolean firstCall = GL_TRUE;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync GLboolean lighting, depthTest, scissorTest;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (firstCall) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* Convert pointerImage into pointerBitmap */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync GLint i, j;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync for (i = 0; i < POINTER_HEIGHT; i++) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync for (j = 0; j < POINTER_WIDTH; j++) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (pointerImage[POINTER_HEIGHT - i - 1][j] == 'X') {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync GLubyte bit = 128 >> (j & 0x7);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pointerBitmap[i][j / 8] |= bit;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync firstCall = GL_FALSE;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.GetBooleanv(GL_LIGHTING, &lighting);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.GetBooleanv(GL_DEPTH_TEST, &depthTest);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.GetBooleanv(GL_SCISSOR_TEST, &scissorTest);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.Disable(GL_LIGHTING);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.Disable(GL_DEPTH_TEST);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.Disable(GL_SCISSOR_TEST);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.PixelStorei(GL_UNPACK_ALIGNMENT, 1);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.Color3f(1, 1, 1);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* save current raster pos */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.PushAttrib(GL_CURRENT_BIT);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync SetRasterPos(x, y);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.Bitmap(POINTER_WIDTH, POINTER_HEIGHT, 1.0, 31.0, 0, 0,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync (const GLubyte *) pointerBitmap);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* restore current raster pos */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.PopAttrib();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (lighting)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.Enable(GL_LIGHTING);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (depthTest)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.Enable(GL_DEPTH_TEST);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (scissorTest)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.Enable(GL_SCISSOR_TEST);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncvoid RENDER_APIENTRY renderspuSwapBuffers( GLint window, GLint flags )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync WindowInfo *w = (WindowInfo *) crHashtableSearch(render_spu.windowTable, window);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (!w)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crDebug("Render SPU: SwapBuffers invalid window id: %d", window);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (flags & CR_SUPPRESS_SWAP_BIT)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.Finish();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (render_spu.drawCursor)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync DrawCursor( render_spu.cursorX, render_spu.cursorY );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (render_spu.swap_master_url)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync DoSync();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspu_SystemSwapBuffers( w, flags );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/*
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Barrier functions
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Normally, we'll have a crserver somewhere that handles the barrier calls.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * However, if we're running the render SPU on the client node, then we
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * should handle barriers here. The threadtest demo illustrates this.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * If we have N threads calling using this SPU we need these barrier
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * functions to synchronize them.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void RENDER_APIENTRY renderspuBarrierCreateCR( GLuint name, GLuint count )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync Barrier *b;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (render_spu.ignore_papi)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync b = (Barrier *) crHashtableSearch( render_spu.barrierHash, name );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (b) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* HACK -- this allows everybody to create a barrier, and all
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync but the first creation are ignored, assuming the count
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync match. */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if ( b->count != count ) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crError( "Render SPU: Barrier name=%u created with count=%u, but already "
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "exists with count=%u", name, count, b->count );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync b = (Barrier *) crAlloc( sizeof(Barrier) );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync b->count = count;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crInitBarrier( &b->barrier, count );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crHashtableAdd( render_spu.barrierHash, name, b );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void RENDER_APIENTRY renderspuBarrierDestroyCR( GLuint name )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (render_spu.ignore_papi)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crHashtableDelete( render_spu.barrierHash, name, crFree );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void RENDER_APIENTRY renderspuBarrierExecCR( GLuint name )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync Barrier *b;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (render_spu.ignore_papi)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync b = (Barrier *) crHashtableSearch( render_spu.barrierHash, name );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (b) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWaitBarrier( &(b->barrier) );
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("Render SPU: Bad barrier name %d in BarrierExec()", name);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
10258d88c40d8254a2a0d89e9b6c1f3b487f5c2dvboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/*
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Semaphore functions
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * XXX we should probably implement these too, for the same reason as
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * barriers (see above).
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void RENDER_APIENTRY renderspuSemaphoreCreateCR( GLuint name, GLuint count )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync (void) name;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync (void) count;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void RENDER_APIENTRY renderspuSemaphoreDestroyCR( GLuint name )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync (void) name;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void RENDER_APIENTRY renderspuSemaphorePCR( GLuint name )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync (void) name;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void RENDER_APIENTRY renderspuSemaphoreVCR( GLuint name )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync (void) name;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/*
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Misc functions
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void RENDER_APIENTRY renderspuChromiumParameteriCR(GLenum target, GLint value)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync switch (target)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync case GL_HOST_WND_CREATED_HIDDEN:
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.force_hidden_wdn_create = value ? GL_TRUE : GL_FALSE;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync break;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync default:
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync// crWarning("Unhandled target in renderspuChromiumParameteriCR()");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync break;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void RENDER_APIENTRY
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncrenderspuChromiumParameterfCR(GLenum target, GLfloat value)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync (void) target;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync (void) value;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#if 0
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync switch (target) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync default:
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("Unhandled target in renderspuChromiumParameterfCR()");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync break;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#endif
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void RENDER_APIENTRY
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncrenderspuChromiumParametervCR(GLenum target, GLenum type, GLsizei count,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync const GLvoid *values)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync int client_num;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync unsigned short port;
10258d88c40d8254a2a0d89e9b6c1f3b487f5c2dvboxsync CRMessage *msg, pingback;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync unsigned char *privbuf = NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync switch (target) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync case GL_GATHER_CONNECT_CR:
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (render_spu.gather_userbuf_size)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync privbuf = (unsigned char *)crAlloc(1024*768*4);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync port = ((GLint *) values)[0];
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (render_spu.gather_conns == NULL)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.gather_conns = crAlloc(render_spu.server->numClients*sizeof(CRConnection *));
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crError("Oh bother! duplicate GL_GATHER_CONNECT_CR getting through");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync for (client_num=0; client_num< render_spu.server->numClients; client_num++)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync switch (render_spu.server->clients[client_num]->conn->type)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync case CR_TCPIP:
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crDebug("Render SPU: AcceptClient from %s on %d",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.server->clients[client_num]->conn->hostname, render_spu.gather_port);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.gather_conns[client_num] =
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crNetAcceptClient("tcpip", NULL, port, 1024*1024, 1);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync break;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync case CR_GM:
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.gather_conns[client_num] =
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crNetAcceptClient("gm", NULL, port, 1024*1024, 1);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync break;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync default:
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crError("Render SPU: Unknown Network Type to Open Gather Connection");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (render_spu.gather_userbuf_size)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.gather_conns[client_num]->userbuf = privbuf;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.gather_conns[client_num]->userbuf_len = render_spu.gather_userbuf_size;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.gather_conns[client_num]->userbuf = NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.gather_conns[client_num]->userbuf_len = 0;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (render_spu.gather_conns[client_num])
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crDebug("Render SPU: success! from %s", render_spu.gather_conns[client_num]->hostname);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync break;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync case GL_GATHER_DRAWPIXELS_CR:
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pingback.header.type = CR_MESSAGE_OOB;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync for (client_num=0; client_num< render_spu.server->numClients; client_num++)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crNetGetMessage(render_spu.gather_conns[client_num], &msg);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (msg->header.type == CR_MESSAGE_GATHER)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crNetFree(render_spu.gather_conns[client_num], msg);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crError("Render SPU: expecting MESSAGE_GATHER. got crap! (%d of %d)",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync client_num, render_spu.server->numClients-1);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /*
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * We're only hitting the case if we're not actually calling
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * child.SwapBuffers from readback, so a switch about which
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * call to DoSync() we really want [this one, or the one
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * in SwapBuffers above] is not necessary -- karl
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (render_spu.swap_master_url)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync DoSync();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync for (client_num=0; client_num< render_spu.server->numClients; client_num++)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crNetSend(render_spu.gather_conns[client_num], NULL, &pingback,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync sizeof(CRMessageHeader));
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.RasterPos2i(((GLint *)values)[0], ((GLint *)values)[1]);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.DrawPixels( ((GLint *)values)[2], ((GLint *)values)[3],
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ((GLint *)values)[4], ((GLint *)values)[5],
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.gather_conns[0]->userbuf);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.SwapBuffers(((GLint *)values)[6], 0);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync break;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync case GL_CURSOR_POSITION_CR:
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (type == GL_INT && count == 2) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.cursorX = ((GLint *) values)[0];
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.cursorY = ((GLint *) values)[1];
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crDebug("Render SPU: GL_CURSOR_POSITION_CR (%d, %d)", render_spu.cursorX, render_spu.cursorY);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync else {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("Render SPU: Bad type or count for ChromiumParametervCR(GL_CURSOR_POSITION_CR)");
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync break;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync case GL_WINDOW_SIZE_CR:
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* XXX this is old code that should be removed.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * NOTE: we can only resize the default (id=CR_RENDER_DEFAULT_WINDOW_ID) window!!!
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync GLint w, h;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync WindowInfo *window;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(type == GL_INT);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(count == 2);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(values);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync w = ((GLint*)values)[0];
1705f7565ed8533058b8541d72d6c5d4453de00fvboxsync h = ((GLint*)values)[1];
1705f7565ed8533058b8541d72d6c5d4453de00fvboxsync window = (WindowInfo *) crHashtableSearch(render_spu.windowTable, CR_RENDER_DEFAULT_WINDOW_ID);
1705f7565ed8533058b8541d72d6c5d4453de00fvboxsync if (window)
1705f7565ed8533058b8541d72d6c5d4453de00fvboxsync {
1705f7565ed8533058b8541d72d6c5d4453de00fvboxsync renderspu_SystemWindowSize(window, w, h);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync break;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync default:
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#if 0
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync crWarning("Unhandled target in renderspuChromiumParametervCR(0x%x)", (int) target);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#endif
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync break;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void RENDER_APIENTRY
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncrenderspuGetChromiumParametervCR(GLenum target, GLuint index, GLenum type,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync GLsizei count, GLvoid *values)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync switch (target) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync case GL_WINDOW_SIZE_CR:
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync GLint x, y, w, h, *size = (GLint *) values;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync WindowInfo *window;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(type == GL_INT);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(count == 2);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(values);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync size[0] = size[1] = 0; /* default */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window = (WindowInfo *) crHashtableSearch(render_spu.windowTable, index);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (window)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspu_SystemGetWindowGeometry(window, &x, &y, &w, &h);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync size[0] = w;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync size[1] = h;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync break;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync case GL_WINDOW_POSITION_CR:
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* return window position, as a screen coordinate */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync GLint *pos = (GLint *) values;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync GLint x, y, w, h;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync WindowInfo *window;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(type == GL_INT);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(count == 2);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(values);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pos[0] = pos[1] = 0; /* default */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync window = (WindowInfo *) crHashtableSearch(render_spu.windowTable, index);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (window)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspu_SystemGetWindowGeometry(window, &x, &y, &w, &h);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pos[0] = x;/*window->x;*/
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pos[1] = y;/*window->y;*/
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync break;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync case GL_MAX_WINDOW_SIZE_CR:
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync GLint *maxSize = (GLint *) values;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync WindowInfo *window;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(type == GL_INT);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(count == 2);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync CRASSERT(values);
1705f7565ed8533058b8541d72d6c5d4453de00fvboxsync window = (WindowInfo *) crHashtableSearch(render_spu.windowTable, index);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (window)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspu_SystemGetMaxWindowSize(window, maxSize + 0, maxSize + 1);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync break;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync default:
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ; /* nothing - silence compiler */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void RENDER_APIENTRY
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncrenderspuBoundsInfoCR( CRrecti *bounds, GLbyte *payload, GLint len,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync GLint num_opcodes )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync (void) bounds;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync (void) payload;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync (void) len;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync (void) num_opcodes;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* draw the bounding box */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (render_spu.draw_bbox) {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync GET_CONTEXT(context);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync WindowInfo *window = context->currentWindow;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync GLint x, y, w, h;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync renderspu_SystemGetWindowGeometry(window, &x, &y, &w, &h);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.PushMatrix();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.LoadIdentity();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.MatrixMode(GL_PROJECTION);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.PushMatrix();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.LoadIdentity();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.Ortho(0, w, 0, h, -1, 1);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.Color3f(1, 1, 1);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.Begin(GL_LINE_LOOP);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.Vertex2i(bounds->x1, bounds->y1);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.Vertex2i(bounds->x2, bounds->y1);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.Vertex2i(bounds->x2, bounds->y2);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.Vertex2i(bounds->x1, bounds->y2);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.End();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.PopMatrix();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.MatrixMode(GL_MODELVIEW);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync render_spu.self.PopMatrix();
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic void RENDER_APIENTRY
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncrenderspuWriteback( GLint *writeback )
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync (void) writeback;
}
static void
remove_trailing_space(char *s)
{
int k = crStrlen(s);
while (k > 0 && s[k-1] == ' ')
k--;
s[k] = 0;
}
static const GLubyte * RENDER_APIENTRY
renderspuGetString(GLenum pname)
{
static char tempStr[1000];
GET_CONTEXT(context);
if (pname == GL_EXTENSIONS)
{
const char *nativeExt;
char *crExt, *s1, *s2;
if (!render_spu.ws.glGetString)
return NULL;
nativeExt = (const char *) render_spu.ws.glGetString(GL_EXTENSIONS);
if (!nativeExt) {
/* maybe called w/out current context. */
return NULL;
}
crExt = crStrjoin3(crExtensions, " ", crAppOnlyExtensions);
s1 = crStrIntersect(nativeExt, crExt);
remove_trailing_space(s1);
s2 = crStrjoin3(s1, " ", crChromiumExtensions);
remove_trailing_space(s2);
crFree(crExt);
crFree(s1);
if (context->extensionString)
crFree(context->extensionString);
context->extensionString = s2;
return (const GLubyte *) s2;
}
else if (pname == GL_VENDOR)
return (const GLubyte *) CR_VENDOR;
else if (pname == GL_VERSION)
return render_spu.ws.glGetString(GL_VERSION);
else if (pname == GL_RENDERER) {
#ifdef VBOX
snprintf(tempStr, sizeof(tempStr), "Chromium (%s)", (char *) render_spu.ws.glGetString(GL_RENDERER));
#else
sprintf(tempStr, "Chromium (%s)", (char *) render_spu.ws.glGetString(GL_RENDERER));
#endif
return (const GLubyte *) tempStr;
}
#ifdef CR_OPENGL_VERSION_2_0
else if (pname == GL_SHADING_LANGUAGE_VERSION)
return render_spu.ws.glGetString(GL_SHADING_LANGUAGE_VERSION);
#endif
#ifdef GL_CR_real_vendor_strings
else if (pname == GL_REAL_VENDOR)
return render_spu.ws.glGetString(GL_VENDOR);
else if (pname == GL_REAL_VERSION)
return render_spu.ws.glGetString(GL_VERSION);
else if (pname == GL_REAL_RENDERER)
return render_spu.ws.glGetString(GL_RENDERER);
else if (pname == GL_REAL_EXTENSIONS)
return render_spu.ws.glGetString(GL_EXTENSIONS);
#endif
else
return NULL;
}
DECLEXPORT(void) renderspuReparentWindow(GLint window)
{
WindowInfo *pWindow;
CRASSERT(window >= 0);
pWindow = (WindowInfo *) crHashtableSearch(render_spu.windowTable, window);
if (!pWindow)
{
crDebug("Render SPU: Attempt to reparent invalid window (%d)", window);
return;
}
renderspu_SystemReparentWindow(pWindow);
}
#define FILLIN( NAME, FUNC ) \
table[i].name = crStrdup(NAME); \
table[i].fn = (SPUGenericFunction) FUNC; \
i++;
/* These are the functions which the render SPU implements, not OpenGL.
*/
int
renderspuCreateFunctions(SPUNamedFunctionTable table[])
{
int i = 0;
FILLIN( "SwapBuffers", renderspuSwapBuffers );
FILLIN( "CreateContext", renderspuCreateContext );
FILLIN( "DestroyContext", renderspuDestroyContext );
FILLIN( "MakeCurrent", renderspuMakeCurrent );
FILLIN( "WindowCreate", renderspuWindowCreate );
FILLIN( "WindowDestroy", renderspuWindowDestroy );
FILLIN( "WindowSize", renderspuWindowSize );
FILLIN( "WindowPosition", renderspuWindowPosition );
FILLIN( "WindowVisibleRegion", renderspuWindowVisibleRegion );
FILLIN( "WindowShow", renderspuWindowShow );
FILLIN( "BarrierCreateCR", renderspuBarrierCreateCR );
FILLIN( "BarrierDestroyCR", renderspuBarrierDestroyCR );
FILLIN( "BarrierExecCR", renderspuBarrierExecCR );
FILLIN( "BoundsInfoCR", renderspuBoundsInfoCR );
FILLIN( "SemaphoreCreateCR", renderspuSemaphoreCreateCR );
FILLIN( "SemaphoreDestroyCR", renderspuSemaphoreDestroyCR );
FILLIN( "SemaphorePCR", renderspuSemaphorePCR );
FILLIN( "SemaphoreVCR", renderspuSemaphoreVCR );
FILLIN( "Writeback", renderspuWriteback );
FILLIN( "ChromiumParameteriCR", renderspuChromiumParameteriCR );
FILLIN( "ChromiumParameterfCR", renderspuChromiumParameterfCR );
FILLIN( "ChromiumParametervCR", renderspuChromiumParametervCR );
FILLIN( "GetChromiumParametervCR", renderspuGetChromiumParametervCR );
FILLIN( "GetString", renderspuGetString );
FILLIN( "VBoxPresentComposition", renderspuVBoxPresentComposition );
return i;
}