summaryrefslogtreecommitdiffstats
path: root/dom/canvas/test/webgl-conf/checkout/conformance2/rendering/clear-func-buffer-type-match.html
blob: 8054d74df2ef4a8f25bb473416572f10adaf51a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<!--
Copyright (c) 2019 The Khronos Group Inc.
Use of this source code is governed by an MIT-style license that can be
found in the LICENSE.txt file.
-->

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Test clear and clearBuffer functions have to match fbo's buffer format</title>
<link rel="stylesheet" href="../../resources/js-test-style.css"/>
<script src="../../js/js-test-pre.js"></script>
<script src="../../js/webgl-test-utils.js"></script>
</head>
<body>
<div id="description"></div>
<div id="console"></div>
<canvas id="canvas" width="20" height="20"> </canvas>
<script>
"use strict";
description("This tests the WebGL2 specific constraint that clear or clearBuffer* functions have to be compatible with fbo's buffer format");

var setupRenderbuffer = function(attachment, format) {
  var renderbuffer = gl.createRenderbuffer();
  gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);
  gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, renderbuffer);
  gl.renderbufferStorage(gl.RENDERBUFFER, format, canvas.width, canvas.height);
  return renderbuffer;
}

var wtu = WebGLTestUtils;
var canvas = document.getElementById("canvas");
var gl = wtu.create3DContext(canvas, undefined, 2);
if (!gl) {
  testFailed("context does not exist");
} else {
  testPassed("context exists");

  var fb = gl.createFramebuffer();
  gl.bindFramebuffer(gl.FRAMEBUFFER, fb);

  debug("");
  debug("Signed integer buffer");

  var colorbuffer = setupRenderbuffer(gl.COLOR_ATTACHMENT0, gl.RGBA8);
  var colorbuffer1 = setupRenderbuffer(gl.COLOR_ATTACHMENT1, gl.RGBA32I);
  gl.drawBuffers([gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1]);
  shouldBe('gl.checkFramebufferStatus(gl.FRAMEBUFFER)', 'gl.FRAMEBUFFER_COMPLETE');

  gl.clear(gl.COLOR_BUFFER_BIT);
  wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "clear and INT buffer");

  gl.clearBufferfv(gl.COLOR, 1, new Float32Array(4));
  wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "clearBufferfv and INT buffer");

  gl.clearBufferuiv(gl.COLOR, 1, new Uint32Array(4));
  wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "clearBufferuiv and INT buffer");

  debug("Set up draw buffer so INT buffer is set to NONE");
  gl.drawBuffers([gl.COLOR_ATTACHMENT0]);
  gl.clear(gl.COLOR_BUFFER_BIT);
  wtu.glErrorShouldBe(gl, gl.NO_ERROR, "clear and INT buffer is NONE");

  gl.clearBufferfv(gl.COLOR, 1, new Float32Array(4));
  wtu.glErrorShouldBe(gl, gl.NO_ERROR, "clearBufferfv and INT buffer is NONE");

  gl.clearBufferuiv(gl.COLOR, 0, new Uint32Array(4));
  wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "clearBufferuiv and float buffer");

  debug("");
  debug("Unsigned integer buffer");

  colorbuffer = setupRenderbuffer(gl.COLOR_ATTACHMENT0, gl.RGBA32UI);
  colorbuffer1 = setupRenderbuffer(gl.COLOR_ATTACHMENT1, gl.RGBA8);
  gl.drawBuffers([gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1]);
  shouldBe('gl.checkFramebufferStatus(gl.FRAMEBUFFER)', 'gl.FRAMEBUFFER_COMPLETE');

  gl.clear(gl.COLOR_BUFFER_BIT);
  wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "clear and UINT buffer");

  gl.clearBufferfv(gl.COLOR, 0, new Float32Array(4));
  wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "clearBufferfv and UINT buffer");

  gl.clearBufferiv(gl.COLOR, 0, new Int32Array(4));
  wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "clearBufferiv and UINT buffer");

  debug("Set up draw buffer so INT buffer is set to NONE");
  gl.drawBuffers([gl.NONE, gl.COLOR_ATTACHMENT1]);
  gl.clear(gl.COLOR_BUFFER_BIT);
  wtu.glErrorShouldBe(gl, gl.NO_ERROR, "clear and UINT buffer is NONE");

  gl.clearBufferfv(gl.COLOR, 0, new Float32Array(4));
  wtu.glErrorShouldBe(gl, gl.NO_ERROR, "clearBufferfv and UINT buffer is NONE");

  gl.clearBufferiv(gl.COLOR, 1, new Int32Array(4));
  wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "clearBufferiv and float buffer");

  debug("");
  debug("Float buffer");

  colorbuffer = setupRenderbuffer(gl.COLOR_ATTACHMENT0, gl.RGBA8);
  var numAttachments = 1;
  var ext = gl.getExtension("EXT_color_buffer_float");
  var bufferType = "float buffer";
  if (ext) {
    debug("EXT_color_buffer_float is available: testing RGBA8 + RGBA32F");
    colorbuffer1 = setupRenderbuffer(gl.COLOR_ATTACHMENT1, gl.RGBA32F);
    ++numAttachments;
    gl.drawBuffers([gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1]);
  } else {
    debug("EXT_color_buffer_float is unavailable: testing RGBA8");
    gl.drawBuffers([gl.COLOR_ATTACHMENT0]);
    bufferType = "RGBA8 buffer";
  }
  shouldBe('gl.checkFramebufferStatus(gl.FRAMEBUFFER)', 'gl.FRAMEBUFFER_COMPLETE');

  gl.clear(gl.COLOR_BUFFER_BIT);
  wtu.glErrorShouldBe(gl, gl.NO_ERROR, "clear and " + bufferType);

  for (var ii = 0; ii < numAttachments; ++ii) {
    gl.clearBufferfv(gl.COLOR, ii, new Float32Array(4));
    wtu.glErrorShouldBe(gl, gl.NO_ERROR, "clearBufferfv and " + bufferType);

    gl.clearBufferiv(gl.COLOR, ii, new Int32Array(4));
    wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "clearBufferiv and " + bufferType);

    gl.clearBufferuiv(gl.COLOR, ii, new Uint32Array(4));
    wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "clearBufferuiv and " + bufferType);
  }

  gl.deleteFramebuffer(fb);
  gl.deleteRenderbuffer(colorbuffer);
  gl.deleteRenderbuffer(colorbuffer1);
}

debug("");
wtu.glErrorShouldBe(gl, gl.NO_ERROR, "should be no error");
var successfullyParsed = true;

</script>
<script src="../../js/js-test-post.js"></script>

</body>
</html>