blob: abc53a017adbc962e8d3e4ac634af14b55247294 [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 GPU_COMMAND_BUFFER_SERVICE_DECODER_CONTEXT_H_
#define GPU_COMMAND_BUFFER_SERVICE_DECODER_CONTEXT_H_
#include <stddef.h>
#include <stdint.h>
#include <string>
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "gpu/command_buffer/common/capabilities.h"
#include "gpu/command_buffer/common/constants.h"
#include "gpu/command_buffer/common/context_result.h"
#include "gpu/command_buffer/service/abstract_texture.h"
#include "gpu/command_buffer/service/async_api_interface.h"
#include "gpu/command_buffer/service/gl_context_virtual_delegate.h"
#include "gpu/gpu_gles2_export.h"
#include "ui/gfx/geometry/rect.h"
namespace gl {
class GLContext;
class GLImage;
class GLSurface;
} // namespace gl
namespace gpu {
class TextureBase;
struct ContextCreationAttribs;
namespace gles2 {
class ContextGroup;
class ErrorState;
class FeatureInfo;
class GpuFenceManager;
class Outputter;
class Texture;
struct DisallowedFeatures;
} // namespace gles2
// Abstract interface implemented by {Raster,GLES2}Decoder. It is called a
// DecoderContext because all methods are about decoding commands or
// accessing context/state generated by decoded commands.
class GPU_GLES2_EXPORT DecoderContext : public AsyncAPIInterface,
public GLContextVirtualDelegate {
public:
DecoderContext() = default;
~DecoderContext() override = default;
//
// Methods required by CommandBufferStub.
//
// Initializes the graphics context. Can create an offscreen
// decoder with a frame buffer that can be referenced from the parent.
// Takes ownership of GLContext.
// Parameters:
// surface: the GL surface to render to.
// context: the GL context to render to.
// offscreen: whether to make the context offscreen or not. When FBO 0 is
// bound, offscreen contexts render to an internal buffer, onscreen ones
// to the surface.
// offscreen_size: the size if the GL context is offscreen.
// Returns:
// true if successful.
virtual gpu::ContextResult Initialize(
const scoped_refptr<gl::GLSurface>& surface,
const scoped_refptr<gl::GLContext>& context,
bool offscreen,
const gles2::DisallowedFeatures& disallowed_features,
const ContextCreationAttribs& attrib_helper) = 0;
// Destroys the graphics context.
virtual void Destroy(bool have_context) = 0;
virtual Capabilities GetCapabilities() = 0;
virtual const gles2::FeatureInfo* GetFeatureInfo() const = 0;
// Gets the associated GLContext.
virtual gl::GLContext* GetGLContext() = 0;
// Gets the associated GLSurface.
virtual gl::GLSurface* GetGLSurface() = 0;
// Make this decoder's GL context current.
virtual bool MakeCurrent() = 0;
// Lose this context.
virtual void MarkContextLost(error::ContextLostReason reason) = 0;
// Returns true if the context was lost either by GL_ARB_robustness, forced
// context loss or command buffer parse error.
virtual bool WasContextLost() const = 0;
// Returns true if the context was lost specifically by GL_ARB_robustness.
virtual bool WasContextLostByRobustnessExtension() const = 0;
// Updates context lost state and returns true if lost. Most callers can use
// WasContextLost() as the GLES2Decoder will update the state internally. But
// if making GL calls directly, to the context then this state would not be
// updated and the caller can use this to determine if their calls failed due
// to context loss.
virtual bool CheckResetStatus() = 0;
// Set a callback to be called when a query is complete. If the query is
// invalid, the callback must be called immediately.
virtual void SetQueryCallback(unsigned int query_client_id,
base::OnceClosure callback) = 0;
// Gets the GpuFenceManager for this context.
virtual gles2::GpuFenceManager* GetGpuFenceManager() = 0;
// Returns false if there are no pending queries.
virtual bool HasPendingQueries() const = 0;
// Process any pending queries.
virtual void ProcessPendingQueries(bool did_finish) = 0;
// Returns false if there is no idle work to be made.
virtual bool HasMoreIdleWork() const = 0;
// Perform any idle work that needs to be made.
virtual void PerformIdleWork() = 0;
// Whether there is state that needs to be regularly polled.
virtual bool HasPollingWork() const = 0;
// Perform necessary polling.
virtual void PerformPollingWork() = 0;
//
// Methods required by GpuVideoDecodeAccelerator.
//
// Gets the texture object associated with the client ID. null is returned on
// failure or if the texture has not been bound yet.
virtual TextureBase* GetTextureBase(uint32_t client_id) = 0;
virtual void SetLevelInfo(uint32_t client_id,
int level,
unsigned internal_format,
unsigned width,
unsigned height,
unsigned depth,
unsigned format,
unsigned type,
const gfx::Rect& cleared_rect) = 0;
virtual void BindImage(uint32_t client_texture_id,
uint32_t texture_target,
gl::GLImage* image,
bool can_bind_to_sampler) = 0;
virtual base::WeakPtr<DecoderContext> AsWeakPtr() = 0;
//
// Methods required by GLES2DecoderHelper.
//
virtual gles2::ContextGroup* GetContextGroup() = 0;
virtual gles2::ErrorState* GetErrorState() = 0;
virtual std::unique_ptr<gpu::gles2::AbstractTexture> CreateAbstractTexture(
unsigned /* GLenum */ target,
unsigned /* GLenum */ internal_format,
int /* GLsizei */ width,
int /* GLsizei */ height,
int /* GLsizei */ depth,
int /* GLint */ border,
unsigned /* GLenum */ format,
unsigned /* GLenum */ type) = 0;
//
// Methods required by Texture.
//
// Indicates whether a given internal format is one for a compressed
// texture.
virtual bool IsCompressedTextureFormat(unsigned format) = 0;
// Clears a level sub area of a 2D texture.
// Returns false if a GL error should be generated.
virtual bool ClearLevel(gles2::Texture* texture,
unsigned target,
int level,
unsigned format,
unsigned type,
int xoffset,
int yoffset,
int width,
int height) = 0;
// Clears a level sub area of a compressed 2D texture.
// Returns false if a GL error should be generated.
virtual bool ClearCompressedTextureLevel(gles2::Texture* texture,
unsigned target,
int level,
unsigned format,
int width,
int height) = 0;
// Clears a level of a 3D texture.
// Returns false if a GL error should be generated.
virtual bool ClearLevel3D(gles2::Texture* texture,
unsigned target,
int level,
unsigned format,
unsigned type,
int width,
int height,
int depth) = 0;
//
// Methods required by InProcessCommandBuffer
//
// Set to true to LOG every command.
virtual void SetLogCommands(bool log_commands) = 0;
//
// Methods required by GpuTracer
//
virtual gles2::Outputter* outputter() const = 0;
};
} // namespace gpu
#endif // GPU_COMMAND_BUFFER_SERVICE_DECODER_CONTEXT_H_