// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "gpu/command_buffer/client/gles2_trace_implementation.h"

#include "base/trace_event/trace_event.h"
#include "gpu/command_buffer/client/client_shared_image.h"

namespace gpu {
namespace gles2 {

GLES2TraceImplementation::GLES2TraceImplementation(GLES2Interface* gl)
    : gl_(gl) {
}

GLES2TraceImplementation::~GLES2TraceImplementation() = default;

bool GLES2TraceImplementation::CanCopySharedImageDirectlyToGLTexture(
    bool is_opaque,
    ClientSharedImage* shared_image,
    uint32_t dst_target,
    uint32_t dst_internal_format,
    uint32_t dst_type,
    int32_t dst_level,
    SkAlphaType dst_alpha_type) {
  return gl_->CanCopySharedImageDirectlyToGLTexture(
      is_opaque, shared_image, dst_target, dst_internal_format, dst_type,
      dst_level, dst_alpha_type);
}

gpu::SyncToken
GLES2TraceImplementation::CopySharedImageToGLTextureViaTextureCopy(
    const gfx::Rect& src_rect,
    ClientSharedImage* source_shared_image,
    const gpu::SyncToken& source_sync_token,
    uint32_t dst_target,
    uint32_t dst_texture,
    uint32_t dst_internal_format,
    uint32_t dst_format,
    uint32_t dst_type,
    int32_t dst_level,
    SkAlphaType dst_alpha_type,
    GrSurfaceOrigin dst_origin) {
  return gl_->CopySharedImageToGLTextureViaTextureCopy(
      src_rect, source_shared_image, source_sync_token, dst_target, dst_texture,
      dst_internal_format, dst_format, dst_type, dst_level, dst_alpha_type,
      dst_origin);
}

std::unique_ptr<gpu::RasterScopedAccess>
GLES2TraceImplementation::CopySharedImageDirectlyToGLTexture(
    const gfx::Rect& src_rect,
    ClientSharedImage* source_shared_image,
    const gpu::SyncToken& source_sync_token,
    bool is_opaque,
    uint32_t dst_target,
    uint32_t dst_texture,
    uint32_t dst_internal_format,
    uint32_t dst_format,
    uint32_t dst_type,
    int32_t dst_level,
    SkAlphaType dst_alpha_type,
    GrSurfaceOrigin dst_origin) {
  return gl_->CopySharedImageDirectlyToGLTexture(
      src_rect, source_shared_image, source_sync_token, is_opaque, dst_target,
      dst_texture, dst_internal_format, dst_format, dst_type, dst_level,
      dst_alpha_type, dst_origin);
}

// InterfaceBase implementation.
void GLES2TraceImplementation::GenSyncTokenCHROMIUM(GLbyte* sync_token) {
  gl_->GenSyncTokenCHROMIUM(sync_token);
}
void GLES2TraceImplementation::GenUnverifiedSyncTokenCHROMIUM(
    GLbyte* sync_token) {
  gl_->GenUnverifiedSyncTokenCHROMIUM(sync_token);
}
void GLES2TraceImplementation::VerifySyncTokensCHROMIUM(GLbyte** sync_tokens,
                                                        GLsizei count) {
  gl_->VerifySyncTokensCHROMIUM(sync_tokens, count);
}
void GLES2TraceImplementation::WaitSyncTokenCHROMIUM(const GLbyte* sync_token) {
  gl_->WaitSyncTokenCHROMIUM(sync_token);
}
void GLES2TraceImplementation::ShallowFlushCHROMIUM() {
  gl_->ShallowFlushCHROMIUM();
}

// Include the auto-generated part of this file. We split this because it means
// we can easily edit the non-auto generated parts right here in this file
// instead of having to edit some template or the code generator.
#include "gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h"

}  // namespace gles2
}  // namespace gpu

