blob: 4cdf58f7d7943ada84d3f2554471f4d8d0f1f612 [file] [log] [blame]
// Copyright (c) 2017 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_RASTER_DECODER_H_
#define GPU_COMMAND_BUFFER_SERVICE_RASTER_DECODER_H_
#include <stdint.h>
#include <string>
#include <vector>
#include "base/callback_forward.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "gpu/command_buffer/common/capabilities.h"
#include "gpu/command_buffer/common/command_buffer_id.h"
#include "gpu/command_buffer/common/constants.h"
#include "gpu/command_buffer/common/context_result.h"
#include "gpu/command_buffer/common/debug_marker_manager.h"
#include "gpu/command_buffer/common/gles2_cmd_format.h"
#include "gpu/command_buffer/service/context_state.h"
#include "gpu/command_buffer/service/error_state.h"
#include "gpu/command_buffer/service/feature_info.h"
#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
#include "gpu/command_buffer/service/gles2_cmd_validation.h"
#include "gpu/command_buffer/service/logger.h"
#include "gpu/gpu_export.h"
namespace gpu {
namespace raster {
// This class implements the AsyncAPIInterface interface, decoding
// RasterInterface commands and calling GL.
class GPU_EXPORT RasterDecoder : public gles2::GLES2Decoder,
public gles2::ErrorStateClient {
public:
RasterDecoder(gles2::GLES2DecoderClient* client,
CommandBufferServiceBase* command_buffer_service,
gles2::Outputter* outputter,
gles2::ContextGroup* group);
~RasterDecoder() override;
// GLES2Decoder implementation.
base::WeakPtr<GLES2Decoder> AsWeakPtr() override;
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) override;
void Destroy(bool have_context) override;
void SetSurface(const scoped_refptr<gl::GLSurface>& surface) override;
void ReleaseSurface() override;
void TakeFrontBuffer(const Mailbox& mailbox) override;
void ReturnFrontBuffer(const Mailbox& mailbox, bool is_lost) override;
bool ResizeOffscreenFramebuffer(const gfx::Size& size) override;
bool MakeCurrent() override;
gles2::GLES2Util* GetGLES2Util() override;
gl::GLContext* GetGLContext() override;
gles2::ContextGroup* GetContextGroup() override;
const gles2::FeatureInfo* GetFeatureInfo() const override;
Capabilities GetCapabilities() override;
void RestoreState(const gles2::ContextState* prev_state) override;
void RestoreActiveTexture() const override;
void RestoreAllTextureUnitAndSamplerBindings(
const gles2::ContextState* prev_state) const override;
void RestoreActiveTextureUnitBinding(unsigned int target) const override;
void RestoreBufferBinding(unsigned int target) override;
void RestoreBufferBindings() const override;
void RestoreFramebufferBindings() const override;
void RestoreRenderbufferBindings() override;
void RestoreGlobalState() const override;
void RestoreProgramBindings() const override;
void RestoreTextureState(unsigned service_id) const override;
void RestoreTextureUnitBindings(unsigned unit) const override;
void RestoreVertexAttribArray(unsigned index) override;
void RestoreAllExternalTextureBindingsIfNeeded() override;
void RestoreDeviceWindowRectangles() const override;
void ClearAllAttributes() const override;
void RestoreAllAttributes() const override;
void SetIgnoreCachedStateForTest(bool ignore) override;
void SetForceShaderNameHashingForTest(bool force) override;
uint32_t GetAndClearBackbufferClearBitsForTest() override;
size_t GetSavedBackTextureCountForTest() override;
size_t GetCreatedBackTextureCountForTest() override;
gles2::QueryManager* GetQueryManager() override;
gles2::GpuFenceManager* GetGpuFenceManager() override;
gles2::FramebufferManager* GetFramebufferManager() override;
gles2::TransformFeedbackManager* GetTransformFeedbackManager() override;
gles2::VertexArrayManager* GetVertexArrayManager() override;
gles2::ImageManager* GetImageManagerForTest() override;
bool HasPendingQueries() const override;
void ProcessPendingQueries(bool did_finish) override;
bool HasMoreIdleWork() const override;
void PerformIdleWork() override;
bool HasPollingWork() const override;
void PerformPollingWork() override;
bool GetServiceTextureId(uint32_t client_texture_id,
uint32_t* service_texture_id) override;
gles2::TextureBase* GetTextureBase(uint32_t client_id) override;
bool ClearLevel(gles2::Texture* texture,
unsigned target,
int level,
unsigned format,
unsigned type,
int xoffset,
int yoffset,
int width,
int height) override;
bool ClearCompressedTextureLevel(gles2::Texture* texture,
unsigned target,
int level,
unsigned format,
int width,
int height) override;
bool IsCompressedTextureFormat(unsigned format) override;
bool ClearLevel3D(gles2::Texture* texture,
unsigned target,
int level,
unsigned format,
unsigned type,
int width,
int height,
int depth) override;
gles2::ErrorState* GetErrorState() override;
void WaitForReadPixels(base::Closure callback) override;
bool WasContextLost() const override;
bool WasContextLostByRobustnessExtension() const override;
void MarkContextLost(error::ContextLostReason reason) override;
bool CheckResetStatus() override;
gles2::Logger* GetLogger() override;
void BeginDecoding() override;
void EndDecoding() override;
const char* GetCommandName(unsigned int command_id) const;
error::Error DoCommands(unsigned int num_commands,
const volatile void* buffer,
int num_entries,
int* entries_processed) override;
const gles2::ContextState* GetContextState() override;
scoped_refptr<gles2::ShaderTranslatorInterface> GetTranslator(
unsigned int type) override;
void BindImage(uint32_t client_texture_id,
uint32_t texture_target,
gl::GLImage* image,
bool can_bind_to_sampler) override;
// ErrorClientState implementation.
void OnContextLostError() override;
void OnOutOfMemoryError() override;
private:
gl::GLApi* api() const { return state_.api(); }
// Set remaining commands to process to 0 to force DoCommands to return
// and allow context preemption and GPU watchdog checks in CommandExecutor().
void ExitCommandProcessingEarly() { commands_to_process_ = 0; }
error::Error HandleGetString(uint32_t immediate_data_size,
const volatile void* cmd_data);
error::Error HandleTraceBeginCHROMIUM(uint32_t immediate_data_size,
const volatile void* cmd_data);
error::Error HandleTraceEndCHROMIUM(uint32_t immediate_data_size,
const volatile void* cmd_data);
error::Error HandleInsertFenceSyncCHROMIUM(uint32_t immediate_data_size,
const volatile void* cmd_data);
error::Error HandleWaitSyncTokenCHROMIUM(uint32_t immediate_data_size,
const volatile void* cmd_data);
typedef gpu::gles2::GLES2Decoder::Error (RasterDecoder::*CmdHandler)(
uint32_t immediate_data_size,
const volatile void* data);
// A struct to hold info about each command.
struct CommandInfo {
CmdHandler cmd_handler;
uint8_t arg_flags; // How to handle the arguments for this command
uint8_t cmd_flags; // How to handle this command
uint16_t arg_count; // How many arguments are expected for this command.
};
// A table of CommandInfo for all the commands.
static CommandInfo
command_info[gles2::kNumCommands - gles2::kFirstGLES2Command];
// Number of commands remaining to be processed in DoCommands().
int commands_to_process_;
// The current decoder error communicates the decoder error through command
// processing functions that do not return the error value. Should be set
// only if not returning an error.
error::Error current_decoder_error_;
scoped_refptr<gl::GLSurface> surface_;
scoped_refptr<gl::GLContext> context_;
gles2::GLES2DecoderClient* client_;
gles2::DebugMarkerManager debug_marker_manager_;
gles2::Logger logger_;
// The ContextGroup for this decoder uses to track resources.
scoped_refptr<gles2::ContextGroup> group_;
const gles2::Validators* validators_;
scoped_refptr<gles2::FeatureInfo> feature_info_;
// All the state for this context.
gles2::ContextState state_;
base::WeakPtrFactory<gles2::GLES2Decoder> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(RasterDecoder);
};
} // namespace raster
} // namespace gpu
#endif // GPU_COMMAND_BUFFER_SERVICE_RASTER_DECODER_H_