packspu_framebuffer.c revision f331d205f60c47a901a1f827ee4c68ef47ece20d
78a072e1b56619e3230735ae073668311232ec94vboxsync/* $Id$ */
78a072e1b56619e3230735ae073668311232ec94vboxsync
78a072e1b56619e3230735ae073668311232ec94vboxsync/** @file
78a072e1b56619e3230735ae073668311232ec94vboxsync * VBox OpenGL FBO related functions
78a072e1b56619e3230735ae073668311232ec94vboxsync */
78a072e1b56619e3230735ae073668311232ec94vboxsync
78a072e1b56619e3230735ae073668311232ec94vboxsync/*
78a072e1b56619e3230735ae073668311232ec94vboxsync * Copyright (C) 2009-2012 Oracle Corporation
2f139cbf73f9adba01382892f33558ad7bcb40cbvboxsync *
2f139cbf73f9adba01382892f33558ad7bcb40cbvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
2f139cbf73f9adba01382892f33558ad7bcb40cbvboxsync * available from http://www.virtualbox.org. This file is free software;
2f139cbf73f9adba01382892f33558ad7bcb40cbvboxsync * you can redistribute it and/or modify it under the terms of the GNU
2f139cbf73f9adba01382892f33558ad7bcb40cbvboxsync * General Public License (GPL) as published by the Free Software
2f139cbf73f9adba01382892f33558ad7bcb40cbvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
2f139cbf73f9adba01382892f33558ad7bcb40cbvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
78a072e1b56619e3230735ae073668311232ec94vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
78a072e1b56619e3230735ae073668311232ec94vboxsync */
78a072e1b56619e3230735ae073668311232ec94vboxsync
78a072e1b56619e3230735ae073668311232ec94vboxsync#include "packspu.h"
78a072e1b56619e3230735ae073668311232ec94vboxsync#include "cr_packfunctions.h"
78a072e1b56619e3230735ae073668311232ec94vboxsync#include "cr_net.h"
78a072e1b56619e3230735ae073668311232ec94vboxsync#include "packspu_proto.h"
dc2db4623ff57b4efcc4033875d3d7176a69f5d3vboxsync
78a072e1b56619e3230735ae073668311232ec94vboxsyncvoid PACKSPU_APIENTRY
78a072e1b56619e3230735ae073668311232ec94vboxsyncpackspu_FramebufferTexture1DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
78a072e1b56619e3230735ae073668311232ec94vboxsync{
78a072e1b56619e3230735ae073668311232ec94vboxsync crStateFramebufferTexture1DEXT(target, attachment, textarget, texture, level);
dc2db4623ff57b4efcc4033875d3d7176a69f5d3vboxsync crPackFramebufferTexture1DEXT(target, attachment, textarget, texture, level);
78a072e1b56619e3230735ae073668311232ec94vboxsync}
78a072e1b56619e3230735ae073668311232ec94vboxsync
78a072e1b56619e3230735ae073668311232ec94vboxsyncvoid PACKSPU_APIENTRY
78a072e1b56619e3230735ae073668311232ec94vboxsyncpackspu_FramebufferTexture2DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
78a072e1b56619e3230735ae073668311232ec94vboxsync{
78a072e1b56619e3230735ae073668311232ec94vboxsync crStateFramebufferTexture2DEXT(target, attachment, textarget, texture, level);
78a072e1b56619e3230735ae073668311232ec94vboxsync crPackFramebufferTexture2DEXT(target, attachment, textarget, texture, level);
78a072e1b56619e3230735ae073668311232ec94vboxsync}
78a072e1b56619e3230735ae073668311232ec94vboxsync
78a072e1b56619e3230735ae073668311232ec94vboxsyncvoid PACKSPU_APIENTRY
78a072e1b56619e3230735ae073668311232ec94vboxsyncpackspu_FramebufferTexture3DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
78a072e1b56619e3230735ae073668311232ec94vboxsync{
78a072e1b56619e3230735ae073668311232ec94vboxsync crStateFramebufferTexture3DEXT(target, attachment, textarget, texture, level, zoffset);
78a072e1b56619e3230735ae073668311232ec94vboxsync crPackFramebufferTexture3DEXT(target, attachment, textarget, texture, level, zoffset);
78a072e1b56619e3230735ae073668311232ec94vboxsync}
78a072e1b56619e3230735ae073668311232ec94vboxsync
78a072e1b56619e3230735ae073668311232ec94vboxsyncvoid PACKSPU_APIENTRY
78a072e1b56619e3230735ae073668311232ec94vboxsyncpackspu_BindFramebufferEXT(GLenum target, GLuint framebuffer)
78a072e1b56619e3230735ae073668311232ec94vboxsync{
e068057c82b010bc7cc663e8f57ac3ef1890a33cvboxsync crStateBindFramebufferEXT(target, framebuffer);
e068057c82b010bc7cc663e8f57ac3ef1890a33cvboxsync crPackBindFramebufferEXT(target, framebuffer);
93dce14edf71c2ea850ed63b2ba81740f145757bvboxsync}
78a072e1b56619e3230735ae073668311232ec94vboxsync
78a072e1b56619e3230735ae073668311232ec94vboxsyncvoid PACKSPU_APIENTRY
78a072e1b56619e3230735ae073668311232ec94vboxsyncpackspu_DeleteFramebuffersEXT(GLsizei n, const GLuint * framebuffers)
78a072e1b56619e3230735ae073668311232ec94vboxsync{
78a072e1b56619e3230735ae073668311232ec94vboxsync crStateDeleteFramebuffersEXT(n, framebuffers);
78a072e1b56619e3230735ae073668311232ec94vboxsync crPackDeleteFramebuffersEXT(n, framebuffers);
78a072e1b56619e3230735ae073668311232ec94vboxsync}
78a072e1b56619e3230735ae073668311232ec94vboxsync
78a072e1b56619e3230735ae073668311232ec94vboxsyncvoid PACKSPU_APIENTRY
78a072e1b56619e3230735ae073668311232ec94vboxsyncpackspu_DeleteRenderbuffersEXT(GLsizei n, const GLuint * renderbuffers)
78a072e1b56619e3230735ae073668311232ec94vboxsync{
78a072e1b56619e3230735ae073668311232ec94vboxsync crStateDeleteRenderbuffersEXT(n, renderbuffers);
78a072e1b56619e3230735ae073668311232ec94vboxsync crPackDeleteRenderbuffersEXT(n, renderbuffers);
78a072e1b56619e3230735ae073668311232ec94vboxsync}
78a072e1b56619e3230735ae073668311232ec94vboxsync
78a072e1b56619e3230735ae073668311232ec94vboxsyncvoid PACKSPU_APIENTRY
78a072e1b56619e3230735ae073668311232ec94vboxsyncpackspu_FramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
78a072e1b56619e3230735ae073668311232ec94vboxsync{
78a072e1b56619e3230735ae073668311232ec94vboxsync crStateFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer);
78a072e1b56619e3230735ae073668311232ec94vboxsync crPackFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer);
78a072e1b56619e3230735ae073668311232ec94vboxsync}
78a072e1b56619e3230735ae073668311232ec94vboxsync
78a072e1b56619e3230735ae073668311232ec94vboxsyncvoid PACKSPU_APIENTRY
78a072e1b56619e3230735ae073668311232ec94vboxsyncpackspu_BindRenderbufferEXT(GLenum target, GLuint renderbuffer)
78a072e1b56619e3230735ae073668311232ec94vboxsync{
78a072e1b56619e3230735ae073668311232ec94vboxsync crStateBindRenderbufferEXT(target, renderbuffer);
78a072e1b56619e3230735ae073668311232ec94vboxsync crPackBindRenderbufferEXT(target, renderbuffer);
78a072e1b56619e3230735ae073668311232ec94vboxsync}
78a072e1b56619e3230735ae073668311232ec94vboxsync
78a072e1b56619e3230735ae073668311232ec94vboxsyncGLenum PACKSPU_APIENTRY
78a072e1b56619e3230735ae073668311232ec94vboxsyncpackspu_CheckFramebufferStatusEXT(GLenum target)
78a072e1b56619e3230735ae073668311232ec94vboxsync{
78a072e1b56619e3230735ae073668311232ec94vboxsync GET_THREAD(thread);
78a072e1b56619e3230735ae073668311232ec94vboxsync int writeback = 1;
78a072e1b56619e3230735ae073668311232ec94vboxsync GLenum status = crStateCheckFramebufferStatusEXT(target);
78a072e1b56619e3230735ae073668311232ec94vboxsync
78a072e1b56619e3230735ae073668311232ec94vboxsync if (status!=GL_FRAMEBUFFER_UNDEFINED)
78a072e1b56619e3230735ae073668311232ec94vboxsync {
78a072e1b56619e3230735ae073668311232ec94vboxsync return status;
78a072e1b56619e3230735ae073668311232ec94vboxsync }
78a072e1b56619e3230735ae073668311232ec94vboxsync
78a072e1b56619e3230735ae073668311232ec94vboxsync crPackCheckFramebufferStatusEXT(target, &status, &writeback);
78a072e1b56619e3230735ae073668311232ec94vboxsync
78a072e1b56619e3230735ae073668311232ec94vboxsync packspuFlush((void *) thread);
78a072e1b56619e3230735ae073668311232ec94vboxsync CRPACKSPU_WRITEBACK_WAIT(thread, writeback);
78a072e1b56619e3230735ae073668311232ec94vboxsync
78a072e1b56619e3230735ae073668311232ec94vboxsync crStateSetFramebufferStatus(target, status);
78a072e1b56619e3230735ae073668311232ec94vboxsync return status;
78a072e1b56619e3230735ae073668311232ec94vboxsync}
78a072e1b56619e3230735ae073668311232ec94vboxsync
78a072e1b56619e3230735ae073668311232ec94vboxsyncvoid PACKSPU_APIENTRY packspu_GenFramebuffersEXT( GLsizei n, GLuint * framebuffers )
78a072e1b56619e3230735ae073668311232ec94vboxsync{
78a072e1b56619e3230735ae073668311232ec94vboxsync GET_THREAD(thread);
78a072e1b56619e3230735ae073668311232ec94vboxsync int writeback = 1;
78a072e1b56619e3230735ae073668311232ec94vboxsync if (!CRPACKSPU_IS_WDDM_CRHGSMI() && !(pack_spu.thread[pack_spu.idxThreadInUse].netServer.conn->actual_network))
78a072e1b56619e3230735ae073668311232ec94vboxsync {
78a072e1b56619e3230735ae073668311232ec94vboxsync crError( "packspu_GenFramebuffersEXT doesn't work when there's no actual network involved!\nTry using the simplequery SPU in your chain!" );
78a072e1b56619e3230735ae073668311232ec94vboxsync }
78a072e1b56619e3230735ae073668311232ec94vboxsync if (pack_spu.swap)
78a072e1b56619e3230735ae073668311232ec94vboxsync {
78a072e1b56619e3230735ae073668311232ec94vboxsync crPackGenFramebuffersEXTSWAP( n, framebuffers, &writeback );
78a072e1b56619e3230735ae073668311232ec94vboxsync }
78a072e1b56619e3230735ae073668311232ec94vboxsync else
78a072e1b56619e3230735ae073668311232ec94vboxsync {
78a072e1b56619e3230735ae073668311232ec94vboxsync crPackGenFramebuffersEXT( n, framebuffers, &writeback );
78a072e1b56619e3230735ae073668311232ec94vboxsync }
0614bee07b5f88aa8803df43fde6d7185a9a7fffvboxsync packspuFlush( (void *) thread );
af15e739afe91d46d418e5844cf3d4e540b9f74avboxsync CRPACKSPU_WRITEBACK_WAIT(thread, writeback);
af15e739afe91d46d418e5844cf3d4e540b9f74avboxsync
2d86fd6bcfe35a4bb83bb8a4fe68090693cdce95vboxsync crStateRegFramebuffers(n, framebuffers);
2d86fd6bcfe35a4bb83bb8a4fe68090693cdce95vboxsync}
2d86fd6bcfe35a4bb83bb8a4fe68090693cdce95vboxsync
2d86fd6bcfe35a4bb83bb8a4fe68090693cdce95vboxsyncvoid PACKSPU_APIENTRY packspu_GenRenderbuffersEXT( GLsizei n, GLuint * renderbuffers )
2d86fd6bcfe35a4bb83bb8a4fe68090693cdce95vboxsync{
78a072e1b56619e3230735ae073668311232ec94vboxsync GET_THREAD(thread);
af15e739afe91d46d418e5844cf3d4e540b9f74avboxsync int writeback = 1;
af15e739afe91d46d418e5844cf3d4e540b9f74avboxsync if (!CRPACKSPU_IS_WDDM_CRHGSMI() && !(pack_spu.thread[pack_spu.idxThreadInUse].netServer.conn->actual_network))
af15e739afe91d46d418e5844cf3d4e540b9f74avboxsync {
78a072e1b56619e3230735ae073668311232ec94vboxsync crError( "packspu_GenRenderbuffersEXT doesn't work when there's no actual network involved!\nTry using the simplequery SPU in your chain!" );
78a072e1b56619e3230735ae073668311232ec94vboxsync }
78a072e1b56619e3230735ae073668311232ec94vboxsync if (pack_spu.swap)
78a072e1b56619e3230735ae073668311232ec94vboxsync {
78a072e1b56619e3230735ae073668311232ec94vboxsync crPackGenRenderbuffersEXTSWAP( n, renderbuffers, &writeback );
78a072e1b56619e3230735ae073668311232ec94vboxsync }
2d86fd6bcfe35a4bb83bb8a4fe68090693cdce95vboxsync else
2d86fd6bcfe35a4bb83bb8a4fe68090693cdce95vboxsync {
2d86fd6bcfe35a4bb83bb8a4fe68090693cdce95vboxsync crPackGenRenderbuffersEXT( n, renderbuffers, &writeback );
af15e739afe91d46d418e5844cf3d4e540b9f74avboxsync }
2d86fd6bcfe35a4bb83bb8a4fe68090693cdce95vboxsync packspuFlush( (void *) thread );
da7dd3061cddf2c716ec50849c4f23a597e82f68vboxsync CRPACKSPU_WRITEBACK_WAIT(thread, writeback);
78a072e1b56619e3230735ae073668311232ec94vboxsync
78a072e1b56619e3230735ae073668311232ec94vboxsync crStateRegRenderbuffers(n, renderbuffers);
67927207a2d6bb545eb655ef14cdb090b1957120vboxsync}
0614bee07b5f88aa8803df43fde6d7185a9a7fffvboxsync