blob: 2497a22d5abdbcd84fa9c5017d2615321bddb19a [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifdef UNSAFE_BUFFERS_BUILD
// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
#pragma allow_unsafe_buffers
#endif
#include "components/viz/test/test_raster_interface.h"
#include <limits>
#include <utility>
#include "base/notreached.h"
#include "base/time/time.h"
#include "gpu/GLES2/gl2extchromium.h"
#include "gpu/command_buffer/common/constants.h"
namespace viz {
TestRasterInterface::TestRasterInterface() {
caps_.max_texture_size = 2048;
}
TestRasterInterface::~TestRasterInterface() = default;
void TestRasterInterface::Finish() {
if (test_support_)
test_support_->CallAllSyncPointCallbacks();
}
void TestRasterInterface::Flush() {
if (test_support_)
test_support_->CallAllSyncPointCallbacks();
}
GLenum TestRasterInterface::GetError() {
return 0;
}
GLenum TestRasterInterface::GetGraphicsResetStatusKHR() {
if (context_lost_)
return GL_UNKNOWN_CONTEXT_RESET_KHR;
return GL_NO_ERROR;
}
void TestRasterInterface::LoseContextCHROMIUM(GLenum current, GLenum other) {
if (context_lost_)
return;
context_lost_ = true;
if (context_lost_callback_)
std::move(context_lost_callback_).Run();
}
void TestRasterInterface::GenQueriesEXT(GLsizei n, GLuint* queries) {
for (GLsizei i = 0; i < n; ++i) {
queries[i] = 1u;
}
}
void TestRasterInterface::DeleteQueriesEXT(GLsizei n, const GLuint* queries) {}
void TestRasterInterface::BeginQueryEXT(GLenum target, GLuint id) {}
void TestRasterInterface::EndQueryEXT(GLenum target) {}
void TestRasterInterface::QueryCounterEXT(GLuint id, GLenum target) {}
void TestRasterInterface::GetQueryObjectuivEXT(GLuint id,
GLenum pname,
GLuint* params) {
// If the context is lost, behave as if result is available.
if (pname == GL_QUERY_RESULT_AVAILABLE_EXT ||
pname == GL_QUERY_RESULT_AVAILABLE_NO_FLUSH_CHROMIUM_EXT) {
*params = 1;
}
}
void TestRasterInterface::GetQueryObjectui64vEXT(GLuint id,
GLenum pname,
GLuint64* params) {
// This is used for testing GL_COMMANDS_ISSUED_TIMESTAMP_QUERY, so we return
// the maximum that base::TimeDelta()::InMicroseconds() could return.
if (pname == GL_QUERY_RESULT_EXT) {
static_assert(std::is_same<decltype(base::TimeDelta().InMicroseconds()),
int64_t>::value,
"Expected the return type of "
"base::TimeDelta()::InMicroseconds() to be int64_t");
*params = std::numeric_limits<int64_t>::max();
} else {
NOTREACHED_IN_MIGRATION();
}
}
gpu::SyncToken TestRasterInterface::ScheduleImageDecode(
base::span<const uint8_t> encoded_data,
const gfx::Size& output_size,
uint32_t transfer_cache_entry_id,
const gfx::ColorSpace& target_color_space,
bool needs_mips) {
return gpu::SyncToken();
}
GLuint TestRasterInterface::CreateAndConsumeForGpuRaster(
const gpu::Mailbox& mailbox) {
NOTREACHED_IN_MIGRATION();
return 0;
}
GLuint TestRasterInterface::CreateAndConsumeForGpuRaster(
const scoped_refptr<gpu::ClientSharedImage>& shared_image) {
NOTREACHED_IN_MIGRATION();
return 0;
}
void TestRasterInterface::DeleteGpuRasterTexture(GLuint texture) {
NOTREACHED_IN_MIGRATION();
}
void TestRasterInterface::BeginGpuRaster() {
NOTREACHED_IN_MIGRATION();
}
void TestRasterInterface::EndGpuRaster() {
NOTREACHED_IN_MIGRATION();
}
void TestRasterInterface::BeginSharedImageAccessDirectCHROMIUM(GLuint texture,
GLenum mode) {
NOTREACHED_IN_MIGRATION();
}
void TestRasterInterface::EndSharedImageAccessDirectCHROMIUM(GLuint texture) {
NOTREACHED_IN_MIGRATION();
}
void TestRasterInterface::InitializeDiscardableTextureCHROMIUM(GLuint texture) {
NOTREACHED_IN_MIGRATION();
}
void TestRasterInterface::UnlockDiscardableTextureCHROMIUM(GLuint texture) {
NOTREACHED_IN_MIGRATION();
}
bool TestRasterInterface::LockDiscardableTextureCHROMIUM(GLuint texture) {
NOTREACHED_IN_MIGRATION();
return false;
}
void TestRasterInterface::GenSyncTokenCHROMIUM(GLbyte* sync_token) {
// Don't return a valid sync token if context is lost. This matches behavior
// of CommandBufferProxyImpl.
if (context_lost_)
return;
gpu::SyncToken sync_token_data(gpu::CommandBufferNamespace::GPU_IO,
gpu::CommandBufferId(),
next_insert_fence_sync_++);
sync_token_data.SetVerifyFlush();
memcpy(sync_token, &sync_token_data, sizeof(sync_token_data));
}
void TestRasterInterface::GenUnverifiedSyncTokenCHROMIUM(GLbyte* sync_token) {
// Don't return a valid sync token if context is lost. This matches behavior
// of CommandBufferProxyImpl.
if (context_lost_)
return;
gpu::SyncToken sync_token_data(gpu::CommandBufferNamespace::GPU_IO,
gpu::CommandBufferId(),
next_insert_fence_sync_++);
memcpy(sync_token, &sync_token_data, sizeof(sync_token_data));
}
void TestRasterInterface::VerifySyncTokensCHROMIUM(GLbyte** sync_tokens,
GLsizei count) {
for (GLsizei i = 0; i < count; ++i) {
gpu::SyncToken sync_token_data;
memcpy(sync_token_data.GetData(), sync_tokens[i], sizeof(sync_token_data));
sync_token_data.SetVerifyFlush();
memcpy(sync_tokens[i], &sync_token_data, sizeof(sync_token_data));
}
}
void TestRasterInterface::WaitSyncTokenCHROMIUM(const GLbyte* sync_token) {
gpu::SyncToken sync_token_data;
if (sync_token)
memcpy(&sync_token_data, sync_token, sizeof(sync_token_data));
if (sync_token_data.release_count() >
last_waited_sync_token_.release_count()) {
last_waited_sync_token_ = sync_token_data;
}
}
void TestRasterInterface::ShallowFlushCHROMIUM() {
if (test_support_)
test_support_->CallAllSyncPointCallbacks();
}
void TestRasterInterface::set_supports_gpu_memory_buffer_format(
gfx::BufferFormat format,
bool support) {
if (support) {
caps_.gpu_memory_buffer_formats.Put(format);
} else {
caps_.gpu_memory_buffer_formats.Remove(format);
}
}
bool TestRasterInterface::ReadbackImagePixels(
const gpu::Mailbox& source_mailbox,
const SkImageInfo& dst_info,
GLuint dst_row_bytes,
int src_x,
int src_y,
int plane_index,
void* dst_pixels) {
auto size = dst_info.computeByteSize(dst_row_bytes);
memset(dst_pixels, 0, size);
return true;
}
} // namespace viz