| 297 | |
| 298 | |
| 299 | void FakePbuffer::setDrawBuffers(GLsizei n, const GLenum *bufs, bool deferred) |
| 300 | { |
| 301 | if(n < 0) |
| 302 | { |
| 303 | // Trigger GL_INVALID_ENUM by passing n < 0 to the real glDrawBuffers() |
| 304 | // function. |
| 305 | _glDrawBuffers(n, bufs); |
| 306 | return; |
| 307 | } |
| 308 | GLint maxDrawBufs = 16; |
| 309 | _glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBufs); |
| 310 | if(n > min(maxDrawBufs, 16)) |
| 311 | { |
| 312 | // Trigger GL_INVALID_VALUE by passing n > the real value of |
| 313 | // GL_MAX_DRAW_BUFFERS to the real glDrawBuffers() function. |
| 314 | _glDrawBuffers(maxDrawBufs + 1, bufs); |
| 315 | return; |
| 316 | } |
| 317 | |
| 318 | GLenum actualBufs[4] = { 0, 0, 0, 0 }; |
| 319 | int nActualBufs = 0; |
| 320 | |
| 321 | for(GLsizei i = 0; i < n; i++) |
| 322 | { |
| 323 | if((bufs[i] >= GL_COLOR_ATTACHMENT0 && bufs[i] <= GL_DEPTH_ATTACHMENT) |
| 324 | || (bufs[i] == GL_BACK && n > 1)) |
| 325 | { |
| 326 | // Trigger GL_INVALID_OPERATION by passing an FBO-incompatible value to |
| 327 | // the real glDrawBuffer() function. |
| 328 | _glDrawBuffer(GL_FRONT_LEFT); |
| 329 | return; |
| 330 | } |
| 331 | if((bufs[i] < GL_FRONT_LEFT || bufs[i] > GL_BACK_RIGHT) |
| 332 | && bufs[i] != GL_NONE && (bufs[i] != GL_BACK || n != 1)) |
| 333 | { |
| 334 | // Trigger GL_INVALID_ENUM by passing an invalid value to the real |
| 335 | // glDrawBuffers() function. |
| 336 | GLenum buf = 0xFFFF; |
| 337 | _glDrawBuffers(1, &buf); |
| 338 | return; |
| 339 | } |
| 340 | if(i > 0) |
| 341 | { |
| 342 | for(GLsizei j = 0; j < i; j++) |
| 343 | { |
| 344 | if(bufs[j] == bufs[i] && bufs[i] != GL_NONE) |
| 345 | { |
| 346 | // Trigger GL_INVALID_OPERATION by passing the FBO-incompatible value |
| 347 | // to the real glDrawBuffer() function. |
| 348 | _glDrawBuffer(bufs[i]); |
| 349 | return; |
| 350 | } |
| 351 | } |
| 352 | } |
| 353 | if(((bufs[i] == GL_FRONT_RIGHT || bufs[i] == GL_RIGHT) |
| 354 | && !config->attr.stereo) |
| 355 | || ((bufs[i] == GL_BACK_LEFT || bufs[i] == GL_BACK) |
| 356 | && !config->attr.doubleBuffer) |
no test coverage detected