blob: c120a67e5a6723289f65a4d5ed80775c83d1fce8 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGL_WEBGL2_COMPUTE_RENDERING_CONTEXT_BASE_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGL_WEBGL2_COMPUTE_RENDERING_CONTEXT_BASE_H_
#include "third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.h"
#include "third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h"
namespace blink {
class WebGLProgram;
class WebGLTexture;
class WebGL2ComputeRenderingContextBase : public WebGL2RenderingContextBase {
public:
void DestroyContext() override;
/* Launch one or more compute work groups */
void dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ);
void dispatchComputeIndirect(int64_t offset);
/* Program interface query */
ScriptValue getProgramInterfaceParameter(ScriptState*,
WebGLProgram*,
GLenum program_interface,
GLenum pname);
GLuint getProgramResourceIndex(WebGLProgram*,
GLenum program_interface,
const String& name);
String getProgramResourceName(WebGLProgram*,
GLenum program_interface,
GLuint index);
base::Optional<Vector<ScriptValue>> getProgramResource(
ScriptState*,
WebGLProgram*,
GLenum program_interface,
GLuint index,
const Vector<GLenum>& props);
ScriptValue getProgramResourceLocation(ScriptState*,
WebGLProgram*,
GLenum program_interface,
const String& name);
/* Bind a level of a texture to an image unit */
void bindImageTexture(GLuint unit,
WebGLTexture* texture,
GLint level,
GLboolean layered,
GLint layer,
GLenum access,
GLenum format);
/* Memory access synchronization */
void memoryBarrier(GLbitfield barriers);
void memoryBarrierByRegion(GLbitfield barriers);
/* WebGLRenderingContextBase overrides */
void InitializeNewContext() override;
ScriptValue getParameter(ScriptState*, GLenum pname) override;
/* WebGL2RenderingContextBase overrides */
ScriptValue getIndexedParameter(ScriptState*,
GLenum target,
GLuint index) override;
void Trace(blink::Visitor*) override;
protected:
WebGL2ComputeRenderingContextBase(
CanvasRenderingContextHost*,
std::unique_ptr<WebGraphicsContext3DProvider>,
bool using_gpu_compositing,
const CanvasContextCreationAttributesCore& requested_attributes);
virtual bool ValidateProgramInterface(const char* function_name,
GLenum program_interface);
virtual bool ValidateProgramResourceIndex(const char* function_name,
WebGLProgram*,
GLenum program_interface,
GLuint index);
virtual bool ValidateAndExtendProgramResourceProperties(
const char* function_name,
GLenum program_interface,
const Vector<GLenum>& props,
Vector<GLenum>& extended_props);
ScriptValue WrapLocation(ScriptState*,
GLint location,
WebGLProgram* program,
GLenum program_interface);
/* WebGLRenderingContextBase overrides */
bool ValidateShaderType(const char* function_name,
GLenum shader_type) override;
bool ValidateBufferTarget(const char* function_name, GLenum target) override;
WebGLBuffer* ValidateBufferDataTarget(const char* function_name,
GLenum target) override;
bool ValidateAndUpdateBufferBindTarget(const char* function_name,
GLenum target,
WebGLBuffer*) override;
void RemoveBoundBuffer(WebGLBuffer*) override;
/* WebGL2RenderingContextBase overrides */
bool ValidateBufferTargetCompatibility(const char* function_name,
GLenum target,
WebGLBuffer*) override;
bool ValidateBufferBaseTarget(const char* function_name,
GLenum target) override;
bool ValidateAndUpdateBufferBindBaseTarget(const char* function_name,
GLenum target,
GLuint index,
WebGLBuffer*) override;
Member<WebGLBuffer> bound_dispatch_indirect_buffer_;
Member<WebGLBuffer> bound_draw_indirect_buffer_;
Member<WebGLBuffer> bound_atomic_counter_buffer_;
Member<WebGLBuffer> bound_shader_storage_buffer_;
HeapVector<Member<WebGLBuffer>> bound_indexed_atomic_counter_buffers_;
HeapVector<Member<WebGLBuffer>> bound_indexed_shader_storage_buffers_;
};
DEFINE_TYPE_CASTS(WebGL2ComputeRenderingContextBase,
CanvasRenderingContext,
context,
context->Is3d() &&
WebGLRenderingContextBase::GetWebGLVersion(context) ==
Platform::kWebGL2ComputeContextType,
context.Is3d() &&
WebGLRenderingContextBase::GetWebGLVersion(&context) ==
Platform::kWebGL2ComputeContextType);
} // namespace blink
#endif