Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1360)

Unified Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 11275120: Virtual GL (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: gpu/command_buffer/service/gles2_cmd_decoder.cc
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 1ad7cbac9c78a5be10979ba1f0408c208d9214f7..6b2194f38f49fafcf2d75829d755a58fe01f79a0 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -513,6 +513,7 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>,
virtual GLES2Util* GetGLES2Util() OVERRIDE { return &util_; }
virtual gfx::GLContext* GetGLContext() OVERRIDE { return context_.get(); }
virtual ContextGroup* GetContextGroup() OVERRIDE { return group_.get(); }
+ virtual void RestoreState() const OVERRIDE;
virtual QueryManager* GetQueryManager() OVERRIDE {
return query_manager_.get();
}
@@ -967,7 +968,7 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>,
GLint* real_location, GLenum* type, GLsizei* count);
// Gets the service id for any simulated backbuffer fbo.
- GLuint GetBackbufferServiceId();
+ GLuint GetBackbufferServiceId() const;
// Helper for glGetBooleanv, glGetFloatv and glGetIntegerv
bool GetHelper(GLenum pname, GLint* params, GLsizei* num_written);
@@ -1557,6 +1558,10 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>,
scoped_ptr<CopyTextureCHROMIUMResourceManager> copy_texture_CHROMIUM_;
+ // Cached values of the currently assigned viewport dimensions.
+ GLsizei viewport_max_width_;
+ GLsizei viewport_max_height_;
+
// Command buffer stats.
int texture_upload_count_;
base::TimeDelta total_texture_upload_time_;
@@ -1942,6 +1947,8 @@ GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group)
force_webgl_glsl_validation_(false),
derivatives_explicitly_enabled_(false),
compile_shader_always_succeeds_(false),
+ viewport_max_width_(0),
+ viewport_max_height_(0),
texture_upload_count_(0) {
DCHECK(group);
@@ -2042,9 +2049,8 @@ bool GLES2DecoderImpl::Initialize(
glBindBuffer(GL_ARRAY_BUFFER, 0);
glGenBuffersARB(1, &fixed_attrib_buffer_id_);
- state_.texture_units.reset(
- new TextureUnit[group_->max_texture_units()]);
- for (uint32 tt = 0; tt < group_->max_texture_units(); ++tt) {
+ state_.texture_units.resize(group_->max_texture_units());
+ for (uint32 tt = 0; tt < state_.texture_units.size(); ++tt) {
glActiveTexture(GL_TEXTURE0 + tt);
// We want the last bind to be 2D.
TextureManager::TextureInfo* info;
@@ -2235,8 +2241,8 @@ bool GLES2DecoderImpl::Initialize(
GLint viewport_params[4] = { 0 };
glGetIntegerv(GL_MAX_VIEWPORT_DIMS, viewport_params);
- state_.viewport_max_width = viewport_params[0];
- state_.viewport_max_height = viewport_params[1];
+ viewport_max_width_ = viewport_params[0];
+ viewport_max_height_ = viewport_params[1];
state_.scissor_width = state_.viewport_width;
state_.scissor_height = state_.viewport_height;
@@ -2482,7 +2488,7 @@ void GLES2DecoderImpl::DeleteTexturesHelper(
clear_state_dirty_ = true;
}
// Unbind texture from texture units.
- for (size_t jj = 0; jj < group_->max_texture_units(); ++jj) {
+ for (size_t jj = 0; jj < state_.texture_units.size(); ++jj) {
state_.texture_units[jj].Unbind(texture);
}
// Unbind from current framebuffers.
@@ -2779,7 +2785,7 @@ void GLES2DecoderImpl::Destroy(bool have_context) {
// Unbind everything.
state_.vertex_attrib_manager = NULL;
default_vertex_attrib_manager_ = NULL;
- state_.texture_units.reset();
+ state_.texture_units.clear();
state_.bound_array_buffer = NULL;
state_.current_query = NULL;
state_.current_program = NULL;
@@ -3234,7 +3240,7 @@ void GLES2DecoderImpl::DoFlush() {
void GLES2DecoderImpl::DoActiveTexture(GLenum texture_unit) {
GLuint texture_index = texture_unit - GL_TEXTURE0;
- if (texture_index >= group_->max_texture_units()) {
+ if (texture_index >= state_.texture_units.size()) {
SetGLErrorInvalidEnum(
"glActiveTexture", texture_unit, "texture_unit");
return;
@@ -3348,10 +3354,20 @@ void GLES2DecoderImpl::BindAndApplyTextureParameters(
glTexParameteri(info->target(), GL_TEXTURE_WRAP_T, info->wrap_t());
}
-GLuint GLES2DecoderImpl::GetBackbufferServiceId() {
+GLuint GLES2DecoderImpl::GetBackbufferServiceId() const {
return (offscreen_target_frame_buffer_.get()) ?
offscreen_target_frame_buffer_->id() :
- surface_->GetBackingFrameBufferObject();
+ (surface_ ? surface_->GetBackingFrameBufferObject() : 0);
+}
+
+void GLES2DecoderImpl::RestoreState() const {
+ state_.RestoreState();
+
+ // TODO: Restore multisample bindings
+ GLuint service_id = state_.bound_draw_framebuffer ?
+ state_.bound_draw_framebuffer->service_id() :
+ GetBackbufferServiceId();
+ glBindFramebufferEXT(GL_FRAMEBUFFER, service_id);
}
void GLES2DecoderImpl::DoBindFramebuffer(GLenum target, GLuint client_id) {
@@ -4729,7 +4745,7 @@ void GLES2DecoderImpl::DoUniform1i(GLint fake_location, GLint v0) {
return;
}
if (!state_.current_program->SetSamplers(
- group_->max_texture_units(), fake_location, 1, &v0)) {
+ state_.texture_units.size(), fake_location, 1, &v0)) {
SetGLError(GL_INVALID_VALUE, "glUniform1i", "texture unit out of range");
return;
}
@@ -4747,7 +4763,7 @@ void GLES2DecoderImpl::DoUniform1iv(
if (type == GL_SAMPLER_2D || type == GL_SAMPLER_2D_RECT_ARB ||
type == GL_SAMPLER_CUBE || type == GL_SAMPLER_EXTERNAL_OES) {
if (!state_.current_program->SetSamplers(
- group_->max_texture_units(), fake_location, count, value)) {
+ state_.texture_units.size(), fake_location, count, value)) {
SetGLError(GL_INVALID_VALUE, "glUniform1iv", "texture unit out of range");
return;
}
@@ -5059,7 +5075,7 @@ bool GLES2DecoderImpl::SetBlackTextureForNonRenderableTextures() {
DCHECK(uniform_info);
for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) {
GLuint texture_unit_index = uniform_info->texture_units[jj];
- if (texture_unit_index < group_->max_texture_units()) {
+ if (texture_unit_index < state_.texture_units.size()) {
TextureUnit& texture_unit = state_.texture_units[texture_unit_index];
TextureManager::TextureInfo* texture_info =
texture_unit.GetInfoForSamplerType(uniform_info->type);
@@ -5093,7 +5109,7 @@ void GLES2DecoderImpl::RestoreStateForNonRenderableTextures() {
DCHECK(uniform_info);
for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) {
GLuint texture_unit_index = uniform_info->texture_units[jj];
- if (texture_unit_index < group_->max_texture_units()) {
+ if (texture_unit_index < state_.texture_units.size()) {
TextureUnit& texture_unit = state_.texture_units[texture_unit_index];
TextureManager::TextureInfo* texture_info =
uniform_info->type == GL_SAMPLER_2D ?
@@ -5131,7 +5147,7 @@ bool GLES2DecoderImpl::ClearUnclearedTextures() {
DCHECK(uniform_info);
for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) {
GLuint texture_unit_index = uniform_info->texture_units[jj];
- if (texture_unit_index < group_->max_texture_units()) {
+ if (texture_unit_index < state_.texture_units.size()) {
TextureUnit& texture_unit = state_.texture_units[texture_unit_index];
TextureManager::TextureInfo* texture_info =
texture_unit.GetInfoForSamplerType(uniform_info->type);
@@ -6219,8 +6235,8 @@ void GLES2DecoderImpl::DoViewport(GLint x, GLint y, GLsizei width,
GLsizei height) {
state_.viewport_x = x;
state_.viewport_y = y;
- state_.viewport_width = std::min(width, state_.viewport_max_width);
- state_.viewport_height = std::min(height, state_.viewport_max_height);
+ state_.viewport_width = std::min(width, viewport_max_width_);
+ state_.viewport_height = std::min(height, viewport_max_height_);
glViewport(x, y, width, height);
}

Powered by Google App Engine
This is Rietveld 408576698