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

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

Issue 2814583002: Service/ClientDiscardableManager (Closed)
Patch Set: rebase Created 3 years, 7 months 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 ee7582839011c5b5797487c6075baf3e63d18f71..49f4fc74411d1b356bb200102ce74d7f6bac8861 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -60,6 +60,7 @@
#include "gpu/command_buffer/service/query_manager.h"
#include "gpu/command_buffer/service/renderbuffer_manager.h"
#include "gpu/command_buffer/service/sampler_manager.h"
+#include "gpu/command_buffer/service/service_discardable_manager.h"
#include "gpu/command_buffer/service/shader_manager.h"
#include "gpu/command_buffer/service/shader_translator.h"
#include "gpu/command_buffer/service/texture_manager.h"
@@ -2216,6 +2217,10 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient {
bool InitializeCopyTexImageBlitter(const char* function_name);
bool InitializeCopyTextureCHROMIUM(const char* function_name);
bool InitializeSRGBConverter(const char* function_name);
+
+ void UnbindTexture(TextureRef* texture_ref,
+ bool supports_separate_framebuffer_binds);
+
// Generate a member function prototype for each command in an automated and
// typesafe way.
#define GLES2_CMD_OP(name) \
@@ -4204,29 +4209,7 @@ void GLES2DecoderImpl::DeleteTexturesHelper(GLsizei n,
GLuint client_id = client_ids[ii];
TextureRef* texture_ref = GetTexture(client_id);
if (texture_ref) {
- Texture* texture = texture_ref->texture();
- if (texture->IsAttachedToFramebuffer()) {
- framebuffer_state_.clear_state_dirty = true;
- }
- // Unbind texture_ref from texture_ref units.
- state_.UnbindTexture(texture_ref);
-
- // Unbind from current framebuffers.
- if (supports_separate_framebuffer_binds) {
- if (framebuffer_state_.bound_read_framebuffer.get()) {
- framebuffer_state_.bound_read_framebuffer
- ->UnbindTexture(GL_READ_FRAMEBUFFER_EXT, texture_ref);
- }
- if (framebuffer_state_.bound_draw_framebuffer.get()) {
- framebuffer_state_.bound_draw_framebuffer
- ->UnbindTexture(GL_DRAW_FRAMEBUFFER_EXT, texture_ref);
- }
- } else {
- if (framebuffer_state_.bound_draw_framebuffer.get()) {
- framebuffer_state_.bound_draw_framebuffer
- ->UnbindTexture(GL_FRAMEBUFFER, texture_ref);
- }
- }
+ UnbindTexture(texture_ref, supports_separate_framebuffer_binds);
RemoveTexture(client_id);
}
}
@@ -8373,6 +8356,33 @@ bool GLES2DecoderImpl::InitializeSRGBConverter(
return true;
}
+void GLES2DecoderImpl::UnbindTexture(TextureRef* texture_ref,
+ bool supports_separate_framebuffer_binds) {
+ Texture* texture = texture_ref->texture();
+ if (texture->IsAttachedToFramebuffer()) {
+ framebuffer_state_.clear_state_dirty = true;
+ }
+ // Unbind texture_ref from texture_ref units.
+ state_.UnbindTexture(texture_ref);
+
+ // Unbind from current framebuffers.
+ if (supports_separate_framebuffer_binds) {
+ if (framebuffer_state_.bound_read_framebuffer.get()) {
+ framebuffer_state_.bound_read_framebuffer->UnbindTexture(
+ GL_READ_FRAMEBUFFER_EXT, texture_ref);
+ }
+ if (framebuffer_state_.bound_draw_framebuffer.get()) {
+ framebuffer_state_.bound_draw_framebuffer->UnbindTexture(
+ GL_DRAW_FRAMEBUFFER_EXT, texture_ref);
+ }
+ } else {
+ if (framebuffer_state_.bound_draw_framebuffer.get()) {
+ framebuffer_state_.bound_draw_framebuffer->UnbindTexture(GL_FRAMEBUFFER,
+ texture_ref);
+ }
+ }
+}
+
void GLES2DecoderImpl::EnsureRenderbufferBound() {
if (!state_.bound_renderbuffer_valid) {
state_.bound_renderbuffer_valid = true;
@@ -19657,6 +19667,63 @@ void GLES2DecoderImpl::RestoreAllExternalTextureBindingsIfNeeded() {
texture_manager()->GetServiceIdGeneration();
}
+error::Error GLES2DecoderImpl::HandleInitializeDiscardableTextureCHROMIUM(
+ uint32_t immediate_data_size,
+ const volatile void* cmd_data) {
+ const volatile gles2::cmds::InitializeDiscardableTextureCHROMIUM& c =
+ *static_cast<
+ const volatile gles2::cmds::InitializeDiscardableTextureCHROMIUM*>(
+ cmd_data);
+ TextureRef* texture = texture_manager()->GetTexture(c.texture_id);
+ if (!texture) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
+ "glInitializeDiscardableTextureCHROMIUM",
+ "Invalid texture ID");
+ return error::kNoError;
+ }
+ size_t size = texture->texture()->estimated_size();
+ ServiceDiscardableHandle handle(GetSharedMemoryBuffer(c.shm_id), c.shm_offset,
+ c.shm_id);
+ GetContextGroup()->discardable_manager()->InsertLockedTexture(
+ c.texture_id, size, group_->texture_manager(), std::move(handle));
+ return error::kNoError;
+}
+
+error::Error GLES2DecoderImpl::HandleUnlockDiscardableTextureCHROMIUM(
+ uint32_t immediate_data_size,
+ const volatile void* cmd_data) {
+ const volatile gles2::cmds::UnlockDiscardableTextureCHROMIUM& c =
+ *static_cast<
+ const volatile gles2::cmds::UnlockDiscardableTextureCHROMIUM*>(
+ cmd_data);
+ ServiceDiscardableManager* discardable_manager =
+ GetContextGroup()->discardable_manager();
+ TextureRef* texture_to_unbind;
+ if (!discardable_manager->UnlockTexture(
+ c.texture_id, group_->texture_manager(), &texture_to_unbind)) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glUnlockDiscardableTextureCHROMIUM",
+ "Texture ID not initialized");
+ }
+ if (texture_to_unbind)
+ UnbindTexture(texture_to_unbind, SupportsSeparateFramebufferBinds());
+
+ return error::kNoError;
+}
+
+error::Error GLES2DecoderImpl::HandleLockDiscardableTextureCHROMIUM(
+ uint32_t immediate_data_size,
+ const volatile void* cmd_data) {
+ const volatile gles2::cmds::LockDiscardableTextureCHROMIUM& c =
+ *static_cast<const volatile gles2::cmds::LockDiscardableTextureCHROMIUM*>(
+ cmd_data);
+ if (!GetContextGroup()->discardable_manager()->LockTexture(
+ c.texture_id, group_->texture_manager())) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glLockDiscardableTextureCHROMIUM",
+ "Texture ID not initialized");
+ }
+ return error::kNoError;
+}
+
// 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.

Powered by Google App Engine
This is Rietveld 408576698