Commit 234cea5f authored by Jiajie Hu's avatar Jiajie Hu Committed by Commit Bot

Teach webgl2-compute about (GL_)DRAW_INDIRECT_BUFFER

This is a change similar to https://crrev.com/666977, but for indirect
drawing instead.

Bug: 859249
Change-Id: Id77a08cb3c3135094217ffce7e3c61d9985dc309
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1772677Reviewed-by: default avatarKenneth Russell <kbr@chromium.org>
Reviewed-by: default avatarGeoff Lang <geofflang@chromium.org>
Commit-Queue: Jiajie Hu <jiajie.hu@intel.com>
Cr-Commit-Position: refs/heads/master@{#691562}
parent 8126cf1d
...@@ -209,6 +209,7 @@ GLES2Implementation::GLES2Implementation( ...@@ -209,6 +209,7 @@ GLES2Implementation::GLES2Implementation(
bound_copy_read_buffer_(0), bound_copy_read_buffer_(0),
bound_copy_write_buffer_(0), bound_copy_write_buffer_(0),
bound_dispatch_indirect_buffer_(0), bound_dispatch_indirect_buffer_(0),
bound_draw_indirect_buffer_(0),
bound_pixel_pack_buffer_(0), bound_pixel_pack_buffer_(0),
bound_pixel_unpack_buffer_(0), bound_pixel_unpack_buffer_(0),
bound_shader_storage_buffer_(0), bound_shader_storage_buffer_(0),
...@@ -1057,6 +1058,9 @@ bool GLES2Implementation::GetHelper(GLenum pname, GLint* params) { ...@@ -1057,6 +1058,9 @@ bool GLES2Implementation::GetHelper(GLenum pname, GLint* params) {
case GL_DISPATCH_INDIRECT_BUFFER_BINDING: case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
*params = bound_dispatch_indirect_buffer_; *params = bound_dispatch_indirect_buffer_;
return true; return true;
case GL_DRAW_INDIRECT_BUFFER_BINDING:
*params = bound_draw_indirect_buffer_;
return true;
case GL_SHADER_STORAGE_BUFFER_BINDING: case GL_SHADER_STORAGE_BUFFER_BINDING:
*params = bound_shader_storage_buffer_; *params = bound_shader_storage_buffer_;
return true; return true;
...@@ -4663,6 +4667,12 @@ void GLES2Implementation::BindBufferHelper(GLenum target, GLuint buffer_id) { ...@@ -4663,6 +4667,12 @@ void GLES2Implementation::BindBufferHelper(GLenum target, GLuint buffer_id) {
changed = true; changed = true;
} }
break; break;
case GL_DRAW_INDIRECT_BUFFER:
if (bound_draw_indirect_buffer_ != buffer_id) {
bound_draw_indirect_buffer_ = buffer_id;
changed = true;
}
break;
case GL_ELEMENT_ARRAY_BUFFER: case GL_ELEMENT_ARRAY_BUFFER:
changed = vertex_array_object_manager_->BindElementArray(buffer_id); changed = vertex_array_object_manager_->BindElementArray(buffer_id);
break; break;
...@@ -4988,6 +4998,9 @@ void GLES2Implementation::DeleteBuffersHelper(GLsizei n, ...@@ -4988,6 +4998,9 @@ void GLES2Implementation::DeleteBuffersHelper(GLsizei n,
if (buffers[ii] == bound_dispatch_indirect_buffer_) { if (buffers[ii] == bound_dispatch_indirect_buffer_) {
bound_dispatch_indirect_buffer_ = 0; bound_dispatch_indirect_buffer_ = 0;
} }
if (buffers[ii] == bound_draw_indirect_buffer_) {
bound_draw_indirect_buffer_ = 0;
}
if (buffers[ii] == bound_pixel_pack_buffer_) { if (buffers[ii] == bound_pixel_pack_buffer_) {
bound_pixel_pack_buffer_ = 0; bound_pixel_pack_buffer_ = 0;
} }
...@@ -5694,6 +5707,7 @@ GLboolean GLES2Implementation::UnmapBuffer(GLenum target) { ...@@ -5694,6 +5707,7 @@ GLboolean GLES2Implementation::UnmapBuffer(GLenum target) {
case GL_COPY_READ_BUFFER: case GL_COPY_READ_BUFFER:
case GL_COPY_WRITE_BUFFER: case GL_COPY_WRITE_BUFFER:
case GL_DISPATCH_INDIRECT_BUFFER: case GL_DISPATCH_INDIRECT_BUFFER:
case GL_DRAW_INDIRECT_BUFFER:
case GL_PIXEL_PACK_BUFFER: case GL_PIXEL_PACK_BUFFER:
case GL_PIXEL_UNPACK_BUFFER: case GL_PIXEL_UNPACK_BUFFER:
case GL_SHADER_STORAGE_BUFFER: case GL_SHADER_STORAGE_BUFFER:
......
...@@ -751,6 +751,7 @@ class GLES2_IMPL_EXPORT GLES2Implementation : public GLES2Interface, ...@@ -751,6 +751,7 @@ class GLES2_IMPL_EXPORT GLES2Implementation : public GLES2Interface,
GLuint bound_copy_read_buffer_; GLuint bound_copy_read_buffer_;
GLuint bound_copy_write_buffer_; GLuint bound_copy_write_buffer_;
GLuint bound_dispatch_indirect_buffer_; GLuint bound_dispatch_indirect_buffer_;
GLuint bound_draw_indirect_buffer_;
GLuint bound_pixel_pack_buffer_; GLuint bound_pixel_pack_buffer_;
GLuint bound_pixel_unpack_buffer_; GLuint bound_pixel_unpack_buffer_;
GLuint bound_shader_storage_buffer_; GLuint bound_shader_storage_buffer_;
......
...@@ -292,6 +292,8 @@ int GLES2Util::GLGetNumValuesReturned(int id) const { ...@@ -292,6 +292,8 @@ int GLES2Util::GLGetNumValuesReturned(int id) const {
return 1; return 1;
case GL_DISPATCH_INDIRECT_BUFFER_BINDING: case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
return 1; return 1;
case GL_DRAW_INDIRECT_BUFFER_BINDING:
return 1;
case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS: case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
return 1; return 1;
case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS: case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
...@@ -1678,6 +1680,8 @@ uint32_t GLES2Util::MapBufferTargetToBindingEnum(uint32_t target) { ...@@ -1678,6 +1680,8 @@ uint32_t GLES2Util::MapBufferTargetToBindingEnum(uint32_t target) {
return GL_COPY_WRITE_BUFFER_BINDING; return GL_COPY_WRITE_BUFFER_BINDING;
case GL_DISPATCH_INDIRECT_BUFFER: case GL_DISPATCH_INDIRECT_BUFFER:
return GL_DISPATCH_INDIRECT_BUFFER_BINDING; return GL_DISPATCH_INDIRECT_BUFFER_BINDING;
case GL_DRAW_INDIRECT_BUFFER:
return GL_DRAW_INDIRECT_BUFFER_BINDING;
case GL_ELEMENT_ARRAY_BUFFER: case GL_ELEMENT_ARRAY_BUFFER:
return GL_ELEMENT_ARRAY_BUFFER_BINDING; return GL_ELEMENT_ARRAY_BUFFER_BINDING;
case GL_PIXEL_PACK_BUFFER: case GL_PIXEL_PACK_BUFFER:
......
...@@ -1861,6 +1861,7 @@ error::Error GLES2DecoderPassthroughImpl::PatchGetNumericResults(GLenum pname, ...@@ -1861,6 +1861,7 @@ error::Error GLES2DecoderPassthroughImpl::PatchGetNumericResults(GLenum pname,
case GL_COPY_WRITE_BUFFER_BINDING: case GL_COPY_WRITE_BUFFER_BINDING:
case GL_UNIFORM_BUFFER_BINDING: case GL_UNIFORM_BUFFER_BINDING:
case GL_DISPATCH_INDIRECT_BUFFER_BINDING: case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
case GL_DRAW_INDIRECT_BUFFER_BINDING:
if (*params != 0 && if (*params != 0 &&
!GetClientID(&resources_->buffer_id_map, *params, params)) { !GetClientID(&resources_->buffer_id_map, *params, params)) {
return error::kInvalidArguments; return error::kInvalidArguments;
......
...@@ -35,6 +35,7 @@ void WebGL2ComputeRenderingContextBase::InitializeNewContext() { ...@@ -35,6 +35,7 @@ void WebGL2ComputeRenderingContextBase::InitializeNewContext() {
DCHECK(GetDrawingBuffer()); DCHECK(GetDrawingBuffer());
bound_dispatch_indirect_buffer_ = nullptr; bound_dispatch_indirect_buffer_ = nullptr;
bound_draw_indirect_buffer_ = nullptr;
bound_atomic_counter_buffer_ = nullptr; bound_atomic_counter_buffer_ = nullptr;
bound_shader_storage_buffer_ = nullptr; bound_shader_storage_buffer_ = nullptr;
...@@ -383,6 +384,8 @@ ScriptValue WebGL2ComputeRenderingContextBase::getParameter( ...@@ -383,6 +384,8 @@ ScriptValue WebGL2ComputeRenderingContextBase::getParameter(
return GetInt64Parameter(script_state, pname); return GetInt64Parameter(script_state, pname);
case GL_DISPATCH_INDIRECT_BUFFER_BINDING: case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
return WebGLAny(script_state, bound_dispatch_indirect_buffer_.Get()); return WebGLAny(script_state, bound_dispatch_indirect_buffer_.Get());
case GL_DRAW_INDIRECT_BUFFER_BINDING:
return WebGLAny(script_state, bound_draw_indirect_buffer_.Get());
default: default:
return WebGL2RenderingContextBase::getParameter(script_state, pname); return WebGL2RenderingContextBase::getParameter(script_state, pname);
...@@ -431,6 +434,7 @@ ScriptValue WebGL2ComputeRenderingContextBase::getIndexedParameter( ...@@ -431,6 +434,7 @@ ScriptValue WebGL2ComputeRenderingContextBase::getIndexedParameter(
void WebGL2ComputeRenderingContextBase::Trace(blink::Visitor* visitor) { void WebGL2ComputeRenderingContextBase::Trace(blink::Visitor* visitor) {
visitor->Trace(bound_dispatch_indirect_buffer_); visitor->Trace(bound_dispatch_indirect_buffer_);
visitor->Trace(bound_draw_indirect_buffer_);
visitor->Trace(bound_atomic_counter_buffer_); visitor->Trace(bound_atomic_counter_buffer_);
visitor->Trace(bound_indexed_atomic_counter_buffers_); visitor->Trace(bound_indexed_atomic_counter_buffers_);
visitor->Trace(bound_shader_storage_buffer_); visitor->Trace(bound_shader_storage_buffer_);
...@@ -645,6 +649,7 @@ bool WebGL2ComputeRenderingContextBase::ValidateBufferTarget( ...@@ -645,6 +649,7 @@ bool WebGL2ComputeRenderingContextBase::ValidateBufferTarget(
GLenum target) { GLenum target) {
switch (target) { switch (target) {
case GL_DISPATCH_INDIRECT_BUFFER: case GL_DISPATCH_INDIRECT_BUFFER:
case GL_DRAW_INDIRECT_BUFFER:
case GL_ATOMIC_COUNTER_BUFFER: case GL_ATOMIC_COUNTER_BUFFER:
case GL_SHADER_STORAGE_BUFFER: case GL_SHADER_STORAGE_BUFFER:
return true; return true;
...@@ -662,6 +667,9 @@ WebGLBuffer* WebGL2ComputeRenderingContextBase::ValidateBufferDataTarget( ...@@ -662,6 +667,9 @@ WebGLBuffer* WebGL2ComputeRenderingContextBase::ValidateBufferDataTarget(
case GL_DISPATCH_INDIRECT_BUFFER: case GL_DISPATCH_INDIRECT_BUFFER:
buffer = bound_dispatch_indirect_buffer_.Get(); buffer = bound_dispatch_indirect_buffer_.Get();
break; break;
case GL_DRAW_INDIRECT_BUFFER:
buffer = bound_draw_indirect_buffer_.Get();
break;
case GL_ATOMIC_COUNTER_BUFFER: case GL_ATOMIC_COUNTER_BUFFER:
buffer = bound_atomic_counter_buffer_.Get(); buffer = bound_atomic_counter_buffer_.Get();
break; break;
...@@ -694,6 +702,9 @@ bool WebGL2ComputeRenderingContextBase::ValidateAndUpdateBufferBindTarget( ...@@ -694,6 +702,9 @@ bool WebGL2ComputeRenderingContextBase::ValidateAndUpdateBufferBindTarget(
case GL_DISPATCH_INDIRECT_BUFFER: case GL_DISPATCH_INDIRECT_BUFFER:
bound_dispatch_indirect_buffer_ = buffer; bound_dispatch_indirect_buffer_ = buffer;
break; break;
case GL_DRAW_INDIRECT_BUFFER:
bound_draw_indirect_buffer_ = buffer;
break;
case GL_ATOMIC_COUNTER_BUFFER: case GL_ATOMIC_COUNTER_BUFFER:
bound_atomic_counter_buffer_ = buffer; bound_atomic_counter_buffer_ = buffer;
break; break;
...@@ -713,6 +724,8 @@ bool WebGL2ComputeRenderingContextBase::ValidateAndUpdateBufferBindTarget( ...@@ -713,6 +724,8 @@ bool WebGL2ComputeRenderingContextBase::ValidateAndUpdateBufferBindTarget(
void WebGL2ComputeRenderingContextBase::RemoveBoundBuffer(WebGLBuffer* buffer) { void WebGL2ComputeRenderingContextBase::RemoveBoundBuffer(WebGLBuffer* buffer) {
if (bound_dispatch_indirect_buffer_ == buffer) if (bound_dispatch_indirect_buffer_ == buffer)
bound_dispatch_indirect_buffer_ = nullptr; bound_dispatch_indirect_buffer_ = nullptr;
if (bound_draw_indirect_buffer_ == buffer)
bound_draw_indirect_buffer_ = nullptr;
if (bound_atomic_counter_buffer_ == buffer) if (bound_atomic_counter_buffer_ == buffer)
bound_atomic_counter_buffer_ = nullptr; bound_atomic_counter_buffer_ = nullptr;
if (bound_shader_storage_buffer_ == buffer) if (bound_shader_storage_buffer_ == buffer)
...@@ -731,6 +744,7 @@ bool WebGL2ComputeRenderingContextBase::ValidateBufferTargetCompatibility( ...@@ -731,6 +744,7 @@ bool WebGL2ComputeRenderingContextBase::ValidateBufferTargetCompatibility(
case GL_ELEMENT_ARRAY_BUFFER: case GL_ELEMENT_ARRAY_BUFFER:
switch (target) { switch (target) {
case GL_DISPATCH_INDIRECT_BUFFER: case GL_DISPATCH_INDIRECT_BUFFER:
case GL_DRAW_INDIRECT_BUFFER:
case GL_ATOMIC_COUNTER_BUFFER: case GL_ATOMIC_COUNTER_BUFFER:
case GL_SHADER_STORAGE_BUFFER: case GL_SHADER_STORAGE_BUFFER:
SynthesizeGLError( SynthesizeGLError(
...@@ -743,6 +757,7 @@ bool WebGL2ComputeRenderingContextBase::ValidateBufferTargetCompatibility( ...@@ -743,6 +757,7 @@ bool WebGL2ComputeRenderingContextBase::ValidateBufferTargetCompatibility(
} }
break; break;
case GL_DISPATCH_INDIRECT_BUFFER: case GL_DISPATCH_INDIRECT_BUFFER:
case GL_DRAW_INDIRECT_BUFFER:
case GL_ATOMIC_COUNTER_BUFFER: case GL_ATOMIC_COUNTER_BUFFER:
case GL_SHADER_STORAGE_BUFFER: case GL_SHADER_STORAGE_BUFFER:
if (target == GL_ELEMENT_ARRAY_BUFFER) { if (target == GL_ELEMENT_ARRAY_BUFFER) {
......
...@@ -114,6 +114,7 @@ class WebGL2ComputeRenderingContextBase : public WebGL2RenderingContextBase { ...@@ -114,6 +114,7 @@ class WebGL2ComputeRenderingContextBase : public WebGL2RenderingContextBase {
WebGLBuffer*) override; WebGLBuffer*) override;
Member<WebGLBuffer> bound_dispatch_indirect_buffer_; Member<WebGLBuffer> bound_dispatch_indirect_buffer_;
Member<WebGLBuffer> bound_draw_indirect_buffer_;
Member<WebGLBuffer> bound_atomic_counter_buffer_; Member<WebGLBuffer> bound_atomic_counter_buffer_;
Member<WebGLBuffer> bound_shader_storage_buffer_; Member<WebGLBuffer> bound_shader_storage_buffer_;
......
...@@ -7,6 +7,8 @@ interface mixin WebGL2ComputeRenderingContextBase { ...@@ -7,6 +7,8 @@ interface mixin WebGL2ComputeRenderingContextBase {
const GLenum COMPUTE_SHADER = 0x91B9; const GLenum COMPUTE_SHADER = 0x91B9;
const GLenum DISPATCH_INDIRECT_BUFFER = 0x90EE; const GLenum DISPATCH_INDIRECT_BUFFER = 0x90EE;
const GLenum DISPATCH_INDIRECT_BUFFER_BINDING = 0x90EF; const GLenum DISPATCH_INDIRECT_BUFFER_BINDING = 0x90EF;
const GLenum DRAW_INDIRECT_BUFFER = 0x8F3F;
const GLenum DRAW_INDIRECT_BUFFER_BINDING = 0x8F43;
const GLenum UNIFORM = 0x92E1; const GLenum UNIFORM = 0x92E1;
const GLenum UNIFORM_BLOCK = 0x92E2; const GLenum UNIFORM_BLOCK = 0x92E2;
const GLenum PROGRAM_INPUT = 0x92E3; const GLenum PROGRAM_INPUT = 0x92E3;
......
...@@ -1545,6 +1545,8 @@ interface WebGL2ComputeRenderingContext ...@@ -1545,6 +1545,8 @@ interface WebGL2ComputeRenderingContext
attribute DRAW_BUFFER9 attribute DRAW_BUFFER9
attribute DRAW_FRAMEBUFFER attribute DRAW_FRAMEBUFFER
attribute DRAW_FRAMEBUFFER_BINDING attribute DRAW_FRAMEBUFFER_BINDING
attribute DRAW_INDIRECT_BUFFER
attribute DRAW_INDIRECT_BUFFER_BINDING
attribute DST_ALPHA attribute DST_ALPHA
attribute DST_COLOR attribute DST_COLOR
attribute DYNAMIC_COPY attribute DYNAMIC_COPY
......
...@@ -1607,6 +1607,8 @@ Starting worker: resources/global-interface-listing-worker.js ...@@ -1607,6 +1607,8 @@ Starting worker: resources/global-interface-listing-worker.js
[Worker] attribute DRAW_BUFFER9 [Worker] attribute DRAW_BUFFER9
[Worker] attribute DRAW_FRAMEBUFFER [Worker] attribute DRAW_FRAMEBUFFER
[Worker] attribute DRAW_FRAMEBUFFER_BINDING [Worker] attribute DRAW_FRAMEBUFFER_BINDING
[Worker] attribute DRAW_INDIRECT_BUFFER
[Worker] attribute DRAW_INDIRECT_BUFFER_BINDING
[Worker] attribute DST_ALPHA [Worker] attribute DST_ALPHA
[Worker] attribute DST_COLOR [Worker] attribute DST_COLOR
[Worker] attribute DYNAMIC_COPY [Worker] attribute DYNAMIC_COPY
......
...@@ -8512,6 +8512,8 @@ interface WebGL2ComputeRenderingContext ...@@ -8512,6 +8512,8 @@ interface WebGL2ComputeRenderingContext
attribute DRAW_BUFFER9 attribute DRAW_BUFFER9
attribute DRAW_FRAMEBUFFER attribute DRAW_FRAMEBUFFER
attribute DRAW_FRAMEBUFFER_BINDING attribute DRAW_FRAMEBUFFER_BINDING
attribute DRAW_INDIRECT_BUFFER
attribute DRAW_INDIRECT_BUFFER_BINDING
attribute DST_ALPHA attribute DST_ALPHA
attribute DST_COLOR attribute DST_COLOR
attribute DYNAMIC_COPY attribute DYNAMIC_COPY
......
...@@ -1465,6 +1465,8 @@ Starting worker: resources/global-interface-listing-worker.js ...@@ -1465,6 +1465,8 @@ Starting worker: resources/global-interface-listing-worker.js
[Worker] attribute DRAW_BUFFER9 [Worker] attribute DRAW_BUFFER9
[Worker] attribute DRAW_FRAMEBUFFER [Worker] attribute DRAW_FRAMEBUFFER
[Worker] attribute DRAW_FRAMEBUFFER_BINDING [Worker] attribute DRAW_FRAMEBUFFER_BINDING
[Worker] attribute DRAW_INDIRECT_BUFFER
[Worker] attribute DRAW_INDIRECT_BUFFER_BINDING
[Worker] attribute DST_ALPHA [Worker] attribute DST_ALPHA
[Worker] attribute DST_COLOR [Worker] attribute DST_COLOR
[Worker] attribute DYNAMIC_COPY [Worker] attribute DYNAMIC_COPY
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment