VirtualBox

source: vbox/trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_framebuffer.c@ 44444

Last change on this file since 44444 was 44059, checked in by vboxsync, 12 years ago

crOpenGL: more gl state fixes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.3 KB
Line 
1/* $Id: server_framebuffer.c 44059 2012-12-07 10:34:42Z vboxsync $ */
2
3/** @file
4 * VBox OpenGL: EXT_framebuffer_object
5 */
6
7/*
8 * Copyright (C) 2009 Oracle Corporation
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.virtualbox.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License (GPL) as published by the Free Software
14 * Foundation, in version 2 as it comes in the "COPYING" file of the
15 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17 */
18
19#include "cr_spu.h"
20#include "chromium.h"
21#include "cr_mem.h"
22#include "cr_net.h"
23#include "server_dispatch.h"
24#include "server.h"
25
26void SERVER_DISPATCH_APIENTRY
27crServerDispatchGenFramebuffersEXT(GLsizei n, GLuint *framebuffers)
28{
29 GLuint *local_buffers = (GLuint *) crAlloc(n * sizeof(*local_buffers));
30 (void) framebuffers;
31
32 crStateGenFramebuffersEXT(n, local_buffers);
33
34 crServerReturnValue(local_buffers, n * sizeof(*local_buffers));
35 crFree(local_buffers);
36}
37
38void SERVER_DISPATCH_APIENTRY
39crServerDispatchGenRenderbuffersEXT(GLsizei n, GLuint *renderbuffers)
40{
41 GLuint *local_buffers = (GLuint *) crAlloc(n * sizeof(*local_buffers));
42 (void) renderbuffers;
43
44 crStateGenRenderbuffersEXT(n, local_buffers);
45
46 crServerReturnValue(local_buffers, n * sizeof(*local_buffers));
47 crFree(local_buffers);
48}
49
50void SERVER_DISPATCH_APIENTRY crServerDispatchFramebufferTexture1DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
51{
52 crStateFramebufferTexture1DEXT(target, attachment, textarget, texture, level);
53 cr_server.head_spu->dispatch_table.FramebufferTexture1DEXT(target, attachment, textarget, crStateGetTextureHWID(texture), level);
54}
55
56void SERVER_DISPATCH_APIENTRY crServerDispatchFramebufferTexture2DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
57{
58 crStateFramebufferTexture2DEXT(target, attachment, textarget, texture, level);
59 cr_server.head_spu->dispatch_table.FramebufferTexture2DEXT(target, attachment, textarget, crStateGetTextureHWID(texture), level);
60}
61
62void SERVER_DISPATCH_APIENTRY crServerDispatchFramebufferTexture3DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
63{
64 crStateFramebufferTexture3DEXT(target, attachment, textarget, texture, level, zoffset);
65 cr_server.head_spu->dispatch_table.FramebufferTexture3DEXT(target, attachment, textarget, crStateGetTextureHWID(texture), level, zoffset);
66}
67
68void SERVER_DISPATCH_APIENTRY crServerDispatchBindFramebufferEXT(GLenum target, GLuint framebuffer)
69{
70#ifdef DEBUG_misha
71 GLint rfb = 0, dfb = 0;
72#endif
73 crStateBindFramebufferEXT(target, framebuffer);
74
75 if (0==framebuffer)
76 {
77 CRContext *ctx = crStateGetCurrent();
78 if (ctx->buffer.drawBuffer == GL_FRONT || ctx->buffer.drawBuffer == GL_FRONT_LEFT || ctx->buffer.drawBuffer == GL_FRONT_RIGHT)
79 cr_server.curClient->currentMural->bFbDraw = GL_TRUE;
80 }
81
82 if (0==framebuffer && crServerIsRedirectedToFBO())
83 {
84 if (target == GL_FRAMEBUFFER)
85 {
86 GLuint idDrawFBO = cr_server.curClient->currentMural->aidFBOs[cr_server.curClient->currentMural->iCurDrawBuffer];
87 GLuint idReadFBO = cr_server.curClient->currentMural->aidFBOs[cr_server.curClient->currentMural->iCurReadBuffer];
88 if (idDrawFBO == idReadFBO)
89 cr_server.head_spu->dispatch_table.BindFramebufferEXT(GL_FRAMEBUFFER, idDrawFBO);
90 else
91 {
92 cr_server.head_spu->dispatch_table.BindFramebufferEXT(GL_READ_FRAMEBUFFER, idReadFBO);
93 cr_server.head_spu->dispatch_table.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, idDrawFBO);
94 }
95 }
96 else if (target == GL_READ_FRAMEBUFFER)
97 {
98 GLuint idReadFBO = cr_server.curClient->currentMural->aidFBOs[cr_server.curClient->currentMural->iCurReadBuffer];
99 cr_server.head_spu->dispatch_table.BindFramebufferEXT(GL_READ_FRAMEBUFFER, idReadFBO);
100 }
101 else if (target == GL_DRAW_FRAMEBUFFER)
102 {
103 GLuint idDrawFBO = cr_server.curClient->currentMural->aidFBOs[cr_server.curClient->currentMural->iCurDrawBuffer];
104 cr_server.head_spu->dispatch_table.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, idDrawFBO);
105 }
106 else
107 {
108 crWarning("unknown target %d", target);
109 }
110#ifdef DEBUG_misha
111 cr_server.head_spu->dispatch_table.GetIntegerv(GL_READ_FRAMEBUFFER_BINDING_EXT, &rfb);
112 cr_server.head_spu->dispatch_table.GetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING_EXT, &dfb);
113 if (GL_FRAMEBUFFER_EXT == target)
114 {
115 Assert(rfb == cr_server.curClient->currentMural->aidFBOs[cr_server.curClient->currentMural->iCurReadBuffer]);
116 Assert(dfb == cr_server.curClient->currentMural->aidFBOs[cr_server.curClient->currentMural->iCurDrawBuffer]);
117 }
118 else if (GL_READ_FRAMEBUFFER_EXT == target)
119 {
120 Assert(rfb == cr_server.curClient->currentMural->aidFBOs[cr_server.curClient->currentMural->iCurReadBuffer]);
121 }
122 else if (GL_DRAW_FRAMEBUFFER_EXT == target)
123 {
124 Assert(dfb == cr_server.curClient->currentMural->aidFBOs[cr_server.curClient->currentMural->iCurDrawBuffer]);
125 }
126 else
127 {
128 Assert(0);
129 }
130#endif
131 }
132 else
133 {
134 cr_server.head_spu->dispatch_table.BindFramebufferEXT(target, crStateGetFramebufferHWID(framebuffer));
135#ifdef DEBUG_misha
136 cr_server.head_spu->dispatch_table.GetIntegerv(GL_READ_FRAMEBUFFER_BINDING_EXT, &rfb);
137 cr_server.head_spu->dispatch_table.GetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING_EXT, &dfb);
138 if (GL_FRAMEBUFFER_EXT == target)
139 {
140 Assert(rfb == crStateGetFramebufferHWID(framebuffer));
141 Assert(dfb == crStateGetFramebufferHWID(framebuffer));
142 }
143 else if (GL_READ_FRAMEBUFFER_EXT == target)
144 {
145 Assert(rfb == crStateGetFramebufferHWID(framebuffer));
146 }
147 else if (GL_DRAW_FRAMEBUFFER_EXT == target)
148 {
149 Assert(dfb == crStateGetFramebufferHWID(framebuffer));
150 }
151 else
152 {
153 Assert(0);
154 }
155#endif
156 }
157}
158
159void SERVER_DISPATCH_APIENTRY crServerDispatchBindRenderbufferEXT(GLenum target, GLuint renderbuffer)
160{
161 crStateBindRenderbufferEXT(target, renderbuffer);
162 cr_server.head_spu->dispatch_table.BindRenderbufferEXT(target, crStateGetRenderbufferHWID(renderbuffer));
163}
164
165void SERVER_DISPATCH_APIENTRY crServerDispatchDeleteFramebuffersEXT(GLsizei n, const GLuint * framebuffers)
166{
167 crStateDeleteFramebuffersEXT(n, framebuffers);
168}
169
170void SERVER_DISPATCH_APIENTRY crServerDispatchDeleteRenderbuffersEXT(GLsizei n, const GLuint * renderbuffers)
171{
172 crStateDeleteRenderbuffersEXT(n, renderbuffers);
173}
174
175void SERVER_DISPATCH_APIENTRY
176crServerDispatchFramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
177{
178 crStateFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer);
179 cr_server.head_spu->dispatch_table.FramebufferRenderbufferEXT(target, attachment, renderbuffertarget, crStateGetRenderbufferHWID(renderbuffer));
180}
181
182void SERVER_DISPATCH_APIENTRY
183crServerDispatchGetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, GLenum pname, GLint * params)
184{
185 GLint local_params[1];
186 (void) params;
187 crStateGetFramebufferAttachmentParameterivEXT(target, attachment, pname, local_params);
188
189 crServerReturnValue(&(local_params[0]), 1*sizeof(GLint));
190}
191
192GLboolean SERVER_DISPATCH_APIENTRY crServerDispatchIsFramebufferEXT( GLuint framebuffer )
193{
194 /* since GenFramebuffers/Renderbuffers issued to host ogl only on bind + some other ops, the host drivers may not know about them
195 * so use state data*/
196 GLboolean retval = crStateIsFramebufferEXT(framebuffer);
197 crServerReturnValue( &retval, sizeof(retval) );
198 return retval; /* WILL PROBABLY BE IGNORED */
199}
200
201GLboolean SERVER_DISPATCH_APIENTRY crServerDispatchIsRenderbufferEXT( GLuint renderbuffer )
202{
203 /* since GenFramebuffers/Renderbuffers issued to host ogl only on bind + some other ops, the host drivers may not know about them
204 * so use state data*/
205 GLboolean retval = crStateIsRenderbufferEXT(renderbuffer);
206 crServerReturnValue( &retval, sizeof(retval) );
207 return retval; /* WILL PROBABLY BE IGNORED */
208}
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette