Commit e1fe4245 authored by Jonathan Backer's avatar Jonathan Backer Committed by Commit Bot

Check sized internal format

Check if sized internal format is supported before making the
glTexStorage2DEXT call. This was called by autogen code for GLES2Decoder
and was not ported over to RasterDecoder.

Also remove some dead autogen code that is not compiled in anywhere.

Bug: 862376
Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;luci.chromium.try:linux_optional_gpu_tests_rel;luci.chromium.try:mac_optional_gpu_tests_rel;luci.chromium.try:win_optional_gpu_tests_rel
Change-Id: I116aa08ac6d381c95650ab8fad9d984ea19af109
Reviewed-on: https://chromium-review.googlesource.com/1140358
Commit-Queue: Jonathan Backer <backer@chromium.org>
Reviewed-by: default avatarAntoine Labour <piman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#576498}
parent e1bfc30e
// 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.
// This file is auto-generated from
// gpu/command_buffer/build_raster_cmd_buffer.py
// It's formatted by clang-format using chromium coding style:
// clang-format -i -style=chromium filename
// DO NOT EDIT!
// It is included by raster_cmd_decoder.cc
#ifndef GPU_COMMAND_BUFFER_SERVICE_RASTER_CMD_DECODER_AUTOGEN_H_
#define GPU_COMMAND_BUFFER_SERVICE_RASTER_CMD_DECODER_AUTOGEN_H_
error::Error RasterDecoderImpl::HandleActiveTexture(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::ActiveTexture& c =
*static_cast<const volatile raster::cmds::ActiveTexture*>(cmd_data);
GLenum texture = static_cast<GLenum>(c.texture);
DoActiveTexture(texture);
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleBindTexture(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::BindTexture& c =
*static_cast<const volatile raster::cmds::BindTexture*>(cmd_data);
GLenum target = static_cast<GLenum>(c.target);
GLuint texture = c.texture;
if (!validators_->texture_bind_target.IsValid(target)) {
LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindTexture", target, "target");
return error::kNoError;
}
DoBindTexture(target, texture);
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleDeleteTexturesImmediate(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::DeleteTexturesImmediate& c =
*static_cast<const volatile raster::cmds::DeleteTexturesImmediate*>(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* textures = GetImmediateDataAs<volatile const GLuint*>(
c, data_size, immediate_data_size);
if (textures == NULL) {
return error::kOutOfBounds;
}
DeleteTexturesHelper(n, textures);
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleFinish(uint32_t immediate_data_size,
const volatile void* cmd_data) {
DoFinish();
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleFlush(uint32_t immediate_data_size,
const volatile void* cmd_data) {
DoFlush();
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleGenTexturesImmediate(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::GenTexturesImmediate& c =
*static_cast<const volatile raster::cmds::GenTexturesImmediate*>(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
return error::kOutOfBounds;
}
volatile GLuint* textures =
GetImmediateDataAs<volatile GLuint*>(c, data_size, immediate_data_size);
if (textures == NULL) {
return error::kOutOfBounds;
}
auto textures_copy = std::make_unique<GLuint[]>(n);
GLuint* textures_safe = textures_copy.get();
std::copy(textures, textures + n, textures_safe);
if (!CheckUniqueAndNonNullIds(n, textures_safe) ||
!GenTexturesHelper(n, textures_safe)) {
return error::kInvalidArguments;
}
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleGetError(uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::GetError& c =
*static_cast<const volatile raster::cmds::GetError*>(cmd_data);
typedef cmds::GetError::Result Result;
Result* result_dst = GetSharedMemoryAs<Result*>(
c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
if (!result_dst) {
return error::kOutOfBounds;
}
*result_dst = GetErrorState()->GetGLError();
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleGetIntegerv(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::GetIntegerv& c =
*static_cast<const volatile raster::cmds::GetIntegerv*>(cmd_data);
GLenum pname = static_cast<GLenum>(c.pname);
typedef cmds::GetIntegerv::Result Result;
GLsizei num_values = 0;
if (!GetNumValuesReturnedForGLGet(pname, &num_values)) {
LOCAL_SET_GL_ERROR_INVALID_ENUM(":GetIntegerv", pname, "pname");
return error::kNoError;
}
Result* result = GetSharedMemoryAs<Result*>(
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
GLint* params = result ? result->GetData() : NULL;
if (!validators_->g_l_state.IsValid(pname)) {
LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetIntegerv", pname, "pname");
return error::kNoError;
}
if (params == NULL) {
return error::kOutOfBounds;
}
LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetIntegerv");
// Check that the client initialized the result.
if (result->size != 0) {
return error::kInvalidArguments;
}
DoGetIntegerv(pname, params, num_values);
GLenum error = LOCAL_PEEK_GL_ERROR("GetIntegerv");
if (error == GL_NO_ERROR) {
result->SetNumResults(num_values);
}
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleTexParameteri(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::TexParameteri& c =
*static_cast<const volatile raster::cmds::TexParameteri*>(cmd_data);
GLenum target = static_cast<GLenum>(c.target);
GLenum pname = static_cast<GLenum>(c.pname);
GLint param = static_cast<GLint>(c.param);
if (!validators_->texture_bind_target.IsValid(target)) {
LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteri", target, "target");
return error::kNoError;
}
if (!validators_->texture_parameter.IsValid(pname)) {
LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteri", pname, "pname");
return error::kNoError;
}
DoTexParameteri(target, pname, param);
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleTexStorage2DEXT(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::TexStorage2DEXT& c =
*static_cast<const volatile raster::cmds::TexStorage2DEXT*>(cmd_data);
if (!features().ext_texture_storage) {
return error::kUnknownCommand;
}
GLenum target = static_cast<GLenum>(c.target);
GLsizei levels = static_cast<GLsizei>(c.levels);
GLenum internalFormat = static_cast<GLenum>(c.internalFormat);
GLsizei width = static_cast<GLsizei>(c.width);
GLsizei height = static_cast<GLsizei>(c.height);
if (!validators_->texture_bind_target.IsValid(target)) {
LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexStorage2DEXT", target, "target");
return error::kNoError;
}
if (levels < 0) {
LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage2DEXT", "levels < 0");
return error::kNoError;
}
if (!validators_->texture_internal_format_storage.IsValid(internalFormat)) {
LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexStorage2DEXT", internalFormat,
"internalFormat");
return error::kNoError;
}
if (width < 0) {
LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage2DEXT", "width < 0");
return error::kNoError;
}
if (height < 0) {
LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage2DEXT", "height < 0");
return error::kNoError;
}
DoTexStorage2DEXT(target, levels, internalFormat, width, height);
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleGenQueriesEXTImmediate(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::GenQueriesEXTImmediate& c =
*static_cast<const volatile raster::cmds::GenQueriesEXTImmediate*>(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
return error::kOutOfBounds;
}
volatile GLuint* queries =
GetImmediateDataAs<volatile GLuint*>(c, data_size, immediate_data_size);
if (queries == NULL) {
return error::kOutOfBounds;
}
auto queries_copy = std::make_unique<GLuint[]>(n);
GLuint* queries_safe = queries_copy.get();
std::copy(queries, queries + n, queries_safe);
if (!CheckUniqueAndNonNullIds(n, queries_safe) ||
!GenQueriesEXTHelper(n, queries_safe)) {
return error::kInvalidArguments;
}
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleDeleteQueriesEXTImmediate(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::DeleteQueriesEXTImmediate& c =
*static_cast<const volatile raster::cmds::DeleteQueriesEXTImmediate*>(
cmd_data);
GLsizei n = static_cast<GLsizei>(c.n);
uint32_t data_size;
if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
return error::kOutOfBounds;
}
volatile const GLuint* queries = GetImmediateDataAs<volatile const GLuint*>(
c, data_size, immediate_data_size);
if (queries == NULL) {
return error::kOutOfBounds;
}
DeleteQueriesEXTHelper(n, queries);
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleCopySubTextureCHROMIUM(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::CopySubTextureCHROMIUM& c =
*static_cast<const volatile raster::cmds::CopySubTextureCHROMIUM*>(
cmd_data);
GLuint source_id = static_cast<GLuint>(c.source_id);
GLint source_level = static_cast<GLint>(c.source_level);
GLenum dest_target = static_cast<GLenum>(c.dest_target);
GLuint dest_id = static_cast<GLuint>(c.dest_id);
GLint dest_level = static_cast<GLint>(c.dest_level);
GLint xoffset = static_cast<GLint>(c.xoffset);
GLint yoffset = static_cast<GLint>(c.yoffset);
GLint x = static_cast<GLint>(c.x);
GLint y = static_cast<GLint>(c.y);
GLsizei width = static_cast<GLsizei>(c.width);
GLsizei height = static_cast<GLsizei>(c.height);
GLboolean unpack_flip_y = static_cast<GLboolean>(c.unpack_flip_y);
GLboolean unpack_premultiply_alpha =
static_cast<GLboolean>(c.unpack_premultiply_alpha);
GLboolean unpack_unmultiply_alpha =
static_cast<GLboolean>(c.unpack_unmultiply_alpha);
if (!validators_->texture_target.IsValid(dest_target)) {
LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopySubTextureCHROMIUM", dest_target,
"dest_target");
return error::kNoError;
}
if (width < 0) {
LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM",
"width < 0");
return error::kNoError;
}
if (height < 0) {
LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM",
"height < 0");
return error::kNoError;
}
DoCopySubTextureCHROMIUM(source_id, source_level, dest_target, dest_id,
dest_level, xoffset, yoffset, x, y, width, height,
unpack_flip_y, unpack_premultiply_alpha,
unpack_unmultiply_alpha);
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleCompressedCopyTextureCHROMIUM(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::CompressedCopyTextureCHROMIUM& c =
*static_cast<const volatile raster::cmds::CompressedCopyTextureCHROMIUM*>(
cmd_data);
GLuint source_id = static_cast<GLuint>(c.source_id);
GLuint dest_id = static_cast<GLuint>(c.dest_id);
DoCompressedCopyTextureCHROMIUM(source_id, dest_id);
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleProduceTextureDirectCHROMIUMImmediate(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::ProduceTextureDirectCHROMIUMImmediate& c =
*static_cast<
const volatile raster::cmds::ProduceTextureDirectCHROMIUMImmediate*>(
cmd_data);
GLuint texture = c.texture;
uint32_t data_size;
if (!GLES2Util::ComputeDataSize<GLbyte, 16>(1, &data_size)) {
return error::kOutOfBounds;
}
if (data_size > immediate_data_size) {
return error::kOutOfBounds;
}
volatile const GLbyte* mailbox = GetImmediateDataAs<volatile const GLbyte*>(
c, data_size, immediate_data_size);
if (mailbox == NULL) {
return error::kOutOfBounds;
}
DoProduceTextureDirectCHROMIUM(texture, mailbox);
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleBindTexImage2DCHROMIUM(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::BindTexImage2DCHROMIUM& c =
*static_cast<const volatile raster::cmds::BindTexImage2DCHROMIUM*>(
cmd_data);
GLenum target = static_cast<GLenum>(c.target);
GLint imageId = static_cast<GLint>(c.imageId);
if (!validators_->texture_bind_target.IsValid(target)) {
LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindTexImage2DCHROMIUM", target,
"target");
return error::kNoError;
}
DoBindTexImage2DCHROMIUM(target, imageId);
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleReleaseTexImage2DCHROMIUM(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::ReleaseTexImage2DCHROMIUM& c =
*static_cast<const volatile raster::cmds::ReleaseTexImage2DCHROMIUM*>(
cmd_data);
GLenum target = static_cast<GLenum>(c.target);
GLint imageId = static_cast<GLint>(c.imageId);
if (!validators_->texture_bind_target.IsValid(target)) {
LOCAL_SET_GL_ERROR_INVALID_ENUM("glReleaseTexImage2DCHROMIUM", target,
"target");
return error::kNoError;
}
DoReleaseTexImage2DCHROMIUM(target, imageId);
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleTraceEndCHROMIUM(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
DoTraceEndCHROMIUM();
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleLoseContextCHROMIUM(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::LoseContextCHROMIUM& c =
*static_cast<const volatile raster::cmds::LoseContextCHROMIUM*>(cmd_data);
GLenum current = static_cast<GLenum>(c.current);
GLenum other = static_cast<GLenum>(c.other);
if (!validators_->reset_status.IsValid(current)) {
LOCAL_SET_GL_ERROR_INVALID_ENUM("glLoseContextCHROMIUM", current,
"current");
return error::kNoError;
}
if (!validators_->reset_status.IsValid(other)) {
LOCAL_SET_GL_ERROR_INVALID_ENUM("glLoseContextCHROMIUM", other, "other");
return error::kNoError;
}
DoLoseContextCHROMIUM(current, other);
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleBeginRasterCHROMIUM(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::BeginRasterCHROMIUM& c =
*static_cast<const volatile raster::cmds::BeginRasterCHROMIUM*>(cmd_data);
if (!features().chromium_raster_transport) {
return error::kUnknownCommand;
}
GLuint texture_id = static_cast<GLuint>(c.texture_id);
GLuint sk_color = static_cast<GLuint>(c.sk_color);
GLuint msaa_sample_count = static_cast<GLuint>(c.msaa_sample_count);
GLboolean can_use_lcd_text = static_cast<GLboolean>(c.can_use_lcd_text);
GLboolean use_distance_field_text =
static_cast<GLboolean>(c.use_distance_field_text);
GLint color_type = static_cast<GLint>(c.color_type);
DoBeginRasterCHROMIUM(texture_id, sk_color, msaa_sample_count,
can_use_lcd_text, use_distance_field_text, color_type);
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleRasterCHROMIUM(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::RasterCHROMIUM& c =
*static_cast<const volatile raster::cmds::RasterCHROMIUM*>(cmd_data);
if (!features().chromium_raster_transport) {
return error::kUnknownCommand;
}
GLsizeiptr size = static_cast<GLsizeiptr>(c.size);
uint32_t data_size = size;
const void* list = GetSharedMemoryAs<const void*>(
c.list_shm_id, c.list_shm_offset, data_size);
if (size < 0) {
LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glRasterCHROMIUM", "size < 0");
return error::kNoError;
}
if (list == NULL) {
return error::kOutOfBounds;
}
DoRasterCHROMIUM(size, list);
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleEndRasterCHROMIUM(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
if (!features().chromium_raster_transport) {
return error::kUnknownCommand;
}
DoEndRasterCHROMIUM();
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleCreateTransferCacheEntryINTERNAL(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::CreateTransferCacheEntryINTERNAL& c =
*static_cast<
const volatile raster::cmds::CreateTransferCacheEntryINTERNAL*>(
cmd_data);
GLuint entry_type = static_cast<GLuint>(c.entry_type);
GLuint entry_id = static_cast<GLuint>(c.entry_id);
GLuint handle_shm_id = static_cast<GLuint>(c.handle_shm_id);
GLuint handle_shm_offset = static_cast<GLuint>(c.handle_shm_offset);
GLuint data_shm_id = static_cast<GLuint>(c.data_shm_id);
GLuint data_shm_offset = static_cast<GLuint>(c.data_shm_offset);
GLuint data_size = static_cast<GLuint>(c.data_size);
DoCreateTransferCacheEntryINTERNAL(entry_type, entry_id, handle_shm_id,
handle_shm_offset, data_shm_id,
data_shm_offset, data_size);
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleDeleteTransferCacheEntryINTERNAL(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::DeleteTransferCacheEntryINTERNAL& c =
*static_cast<
const volatile raster::cmds::DeleteTransferCacheEntryINTERNAL*>(
cmd_data);
GLuint entry_type = static_cast<GLuint>(c.entry_type);
GLuint entry_id = static_cast<GLuint>(c.entry_id);
DoDeleteTransferCacheEntryINTERNAL(entry_type, entry_id);
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleUnlockTransferCacheEntryINTERNAL(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::UnlockTransferCacheEntryINTERNAL& c =
*static_cast<
const volatile raster::cmds::UnlockTransferCacheEntryINTERNAL*>(
cmd_data);
GLuint entry_type = static_cast<GLuint>(c.entry_type);
GLuint entry_id = static_cast<GLuint>(c.entry_id);
DoUnlockTransferCacheEntryINTERNAL(entry_type, entry_id);
return error::kNoError;
}
error::Error RasterDecoderImpl::HandleTexStorage2DImageCHROMIUM(
uint32_t immediate_data_size,
const volatile void* cmd_data) {
const volatile raster::cmds::TexStorage2DImageCHROMIUM& c =
*static_cast<const volatile raster::cmds::TexStorage2DImageCHROMIUM*>(
cmd_data);
if (!features().chromium_texture_storage_image) {
return error::kUnknownCommand;
}
GLenum target = static_cast<GLenum>(c.target);
GLenum internalFormat = static_cast<GLenum>(c.internalFormat);
GLenum bufferUsage = static_cast<GLenum>(c.bufferUsage);
GLsizei width = static_cast<GLsizei>(c.width);
GLsizei height = static_cast<GLsizei>(c.height);
if (!validators_->texture_bind_target.IsValid(target)) {
LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexStorage2DImageCHROMIUM", target,
"target");
return error::kNoError;
}
if (!validators_->texture_internal_format_storage.IsValid(internalFormat)) {
LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexStorage2DImageCHROMIUM",
internalFormat, "internalFormat");
return error::kNoError;
}
if (width < 0) {
LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage2DImageCHROMIUM",
"width < 0");
return error::kNoError;
}
if (height < 0) {
LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage2DImageCHROMIUM",
"height < 0");
return error::kNoError;
}
DoTexStorage2DImageCHROMIUM(target, internalFormat, bufferUsage, width,
height);
return error::kNoError;
}
#endif // GPU_COMMAND_BUFFER_SERVICE_RASTER_CMD_DECODER_AUTOGEN_H_
......@@ -2425,11 +2425,18 @@ bool RasterDecoderImpl::TexStorage2D(gles2::TextureRef* texture_ref,
return false;
}
unsigned int internal_format =
viz::TextureStorageFormat(texture_metadata.format());
if (!feature_info_->validators()->texture_internal_format_storage.IsValid(
internal_format)) {
LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexStorage2D", internal_format,
"internal_format");
return error::kNoError;
}
ScopedTextureBinder binder(&state_, texture_manager(), texture_ref,
texture_metadata.target(), gr_context());
unsigned int internal_format =
viz::TextureStorageFormat(texture_metadata.format());
GLenum format =
gles2::TextureManager::ExtractFormatFromStorageFormat(internal_format);
GLenum type =
......
......@@ -486,6 +486,29 @@ TEST_P(RasterDecoderManualInitTest, CopyTexSubImage2DValidateColorFormat) {
EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
}
TEST_P(RasterDecoderManualInitTest, TexStorage2DValidateColorFormat) {
// GL_EXT_texture_norm16 disabled by default, so glTexStorage2DEXT with
// viz::ResourceFormat::R16_EXT fails validation.
InitState init;
init.extensions.push_back("GL_EXT_texture_storage");
InitDecoder(init);
GLuint texture_id = kNewClientId;
EXPECT_CALL(*gl_, GenTextures(1, _))
.WillOnce(SetArgPointee<1>(kNewServiceId))
.RetiresOnSaturation();
cmds::CreateTexture create_cmd;
create_cmd.Init(false /* use_buffer */, gfx::BufferUsage::GPU_READ,
viz::ResourceFormat::R16_EXT, texture_id);
EXPECT_EQ(error::kNoError, ExecuteCmd(create_cmd));
cmds::TexStorage2D storage_cmd;
storage_cmd.Init(texture_id, /*width=*/2, /*height=*/2);
EXPECT_EQ(error::kNoError, ExecuteCmd(storage_cmd));
EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
}
TEST_P(RasterDecoderTest, GLImageAttachedAfterClearLevel) {
scoped_refptr<gl::GLImage> image(new gl::GLImageStub);
GetImageManagerForTest()->AddImage(image.get(), kImageId);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment