Commit 5077d6dc authored by dcastagna's avatar dcastagna Committed by Commit bot

Make 'kVideoImageTextureTarget' a list of texture targets.

Pass to the renderer a list of texture targets, one per GpuMemoryBuffer
format, via a command line argument.
In this way GMBVFP can pick whatever GMB format it needs to use and bind
to the correct texture target.
This is similar to what we do for content (kContentImageTextureTarget).

kContentImageTextureTarget can't be used since the buffer usage could
differ from the buffer usage in GMBVFP.

Once all GMB formats supports persistent usage and we can consolidate
GPU_READ_CPU_READ_WRITE_PERSISTENT and GPU_READ_CPU_READ_WRITE this
code can go away and we can use just one command line switch.

BUG=524582

Review URL: https://codereview.chromium.org/1605423002

Cr-Commit-Position: refs/heads/master@{#371644}
parent 0864941d
...@@ -1283,6 +1283,9 @@ static void AppendCompositorCommandLineFlags(base::CommandLine* command_line) { ...@@ -1283,6 +1283,9 @@ static void AppendCompositorCommandLineFlags(base::CommandLine* command_line) {
// Persistent buffers may come at a performance hit (not all platform specific // Persistent buffers may come at a performance hit (not all platform specific
// buffers support it), so only enable them if partial raster is enabled and // buffers support it), so only enable them if partial raster is enabled and
// we are actually going to use them. // we are actually going to use them.
// TODO(dcastagna): Once GPU_READ_CPU_READ_WRITE_PERSISTENT is removed
// kContentImageTextureTarget and kVideoImageTextureTarget can be merged into
// one flag.
gfx::BufferUsage buffer_usage = gfx::BufferUsage buffer_usage =
IsPartialRasterEnabled() IsPartialRasterEnabled()
? gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT ? gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT
...@@ -1298,10 +1301,15 @@ static void AppendCompositorCommandLineFlags(base::CommandLine* command_line) { ...@@ -1298,10 +1301,15 @@ static void AppendCompositorCommandLineFlags(base::CommandLine* command_line) {
command_line->AppendSwitchASCII(switches::kContentImageTextureTarget, command_line->AppendSwitchASCII(switches::kContentImageTextureTarget,
UintVectorToString(image_targets)); UintVectorToString(image_targets));
command_line->AppendSwitchASCII( for (size_t format = 0;
switches::kVideoImageTextureTarget, format < static_cast<size_t>(gfx::BufferFormat::LAST) + 1; format++) {
base::UintToString(BrowserGpuMemoryBufferManager::GetImageTextureTarget( image_targets[format] =
gfx::BufferFormat::R_8, gfx::BufferUsage::GPU_READ_CPU_READ_WRITE))); BrowserGpuMemoryBufferManager::GetImageTextureTarget(
static_cast<gfx::BufferFormat>(format),
gfx::BufferUsage::GPU_READ_CPU_READ_WRITE);
}
command_line->AppendSwitchASCII(switches::kVideoImageTextureTarget,
UintVectorToString(image_targets));
// Appending disable-gpu-feature switches due to software rendering list. // Appending disable-gpu-feature switches due to software rendering list.
GpuDataManagerImpl* gpu_data_manager = GpuDataManagerImpl::GetInstance(); GpuDataManagerImpl* gpu_data_manager = GpuDataManagerImpl::GetInstance();
......
...@@ -32,11 +32,11 @@ RendererGpuVideoAcceleratorFactories::Create( ...@@ -32,11 +32,11 @@ RendererGpuVideoAcceleratorFactories::Create(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
const scoped_refptr<ContextProviderCommandBuffer>& context_provider, const scoped_refptr<ContextProviderCommandBuffer>& context_provider,
bool enable_gpu_memory_buffer_video_frames, bool enable_gpu_memory_buffer_video_frames,
unsigned image_texture_target, std::vector<unsigned> image_texture_targets,
bool enable_video_accelerator) { bool enable_video_accelerator) {
return make_scoped_ptr(new RendererGpuVideoAcceleratorFactories( return make_scoped_ptr(new RendererGpuVideoAcceleratorFactories(
gpu_channel_host, main_thread_task_runner, task_runner, context_provider, gpu_channel_host, main_thread_task_runner, task_runner, context_provider,
enable_gpu_memory_buffer_video_frames, image_texture_target, enable_gpu_memory_buffer_video_frames, image_texture_targets,
enable_video_accelerator)); enable_video_accelerator));
} }
...@@ -46,7 +46,7 @@ RendererGpuVideoAcceleratorFactories::RendererGpuVideoAcceleratorFactories( ...@@ -46,7 +46,7 @@ RendererGpuVideoAcceleratorFactories::RendererGpuVideoAcceleratorFactories(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
const scoped_refptr<ContextProviderCommandBuffer>& context_provider, const scoped_refptr<ContextProviderCommandBuffer>& context_provider,
bool enable_gpu_memory_buffer_video_frames, bool enable_gpu_memory_buffer_video_frames,
unsigned image_texture_target, std::vector<unsigned> image_texture_targets,
bool enable_video_accelerator) bool enable_video_accelerator)
: main_thread_task_runner_(main_thread_task_runner), : main_thread_task_runner_(main_thread_task_runner),
task_runner_(task_runner), task_runner_(task_runner),
...@@ -55,7 +55,7 @@ RendererGpuVideoAcceleratorFactories::RendererGpuVideoAcceleratorFactories( ...@@ -55,7 +55,7 @@ RendererGpuVideoAcceleratorFactories::RendererGpuVideoAcceleratorFactories(
context_provider_(context_provider.get()), context_provider_(context_provider.get()),
enable_gpu_memory_buffer_video_frames_( enable_gpu_memory_buffer_video_frames_(
enable_gpu_memory_buffer_video_frames), enable_gpu_memory_buffer_video_frames),
image_texture_target_(image_texture_target), image_texture_targets_(image_texture_targets),
video_accelerator_enabled_(enable_video_accelerator), video_accelerator_enabled_(enable_video_accelerator),
gpu_memory_buffer_manager_(ChildThreadImpl::current() gpu_memory_buffer_manager_(ChildThreadImpl::current()
->gpu_memory_buffer_manager()), ->gpu_memory_buffer_manager()),
...@@ -194,8 +194,9 @@ bool RendererGpuVideoAcceleratorFactories:: ...@@ -194,8 +194,9 @@ bool RendererGpuVideoAcceleratorFactories::
return enable_gpu_memory_buffer_video_frames_; return enable_gpu_memory_buffer_video_frames_;
} }
unsigned RendererGpuVideoAcceleratorFactories::ImageTextureTarget() { unsigned RendererGpuVideoAcceleratorFactories::ImageTextureTarget(
return image_texture_target_; gfx::BufferFormat format) {
return image_texture_targets_[static_cast<int>(format)];
} }
media::VideoPixelFormat media::VideoPixelFormat
......
...@@ -52,7 +52,7 @@ class CONTENT_EXPORT RendererGpuVideoAcceleratorFactories ...@@ -52,7 +52,7 @@ class CONTENT_EXPORT RendererGpuVideoAcceleratorFactories
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
const scoped_refptr<ContextProviderCommandBuffer>& context_provider, const scoped_refptr<ContextProviderCommandBuffer>& context_provider,
bool enable_gpu_memory_buffer_video_frames, bool enable_gpu_memory_buffer_video_frames,
unsigned image_texture_target, std::vector<unsigned> image_texture_targets,
bool enable_video_accelerator); bool enable_video_accelerator);
// media::GpuVideoAcceleratorFactories implementation. // media::GpuVideoAcceleratorFactories implementation.
...@@ -77,7 +77,7 @@ class CONTENT_EXPORT RendererGpuVideoAcceleratorFactories ...@@ -77,7 +77,7 @@ class CONTENT_EXPORT RendererGpuVideoAcceleratorFactories
gfx::BufferUsage usage) override; gfx::BufferUsage usage) override;
bool ShouldUseGpuMemoryBuffersForVideoFrames() const override; bool ShouldUseGpuMemoryBuffersForVideoFrames() const override;
unsigned ImageTextureTarget() override; unsigned ImageTextureTarget(gfx::BufferFormat format) override;
media::VideoPixelFormat VideoFrameOutputFormat() override; media::VideoPixelFormat VideoFrameOutputFormat() override;
scoped_ptr<media::GpuVideoAcceleratorFactories::ScopedGLContextLock> scoped_ptr<media::GpuVideoAcceleratorFactories::ScopedGLContextLock>
GetGLContextLock() override; GetGLContextLock() override;
...@@ -101,7 +101,7 @@ class CONTENT_EXPORT RendererGpuVideoAcceleratorFactories ...@@ -101,7 +101,7 @@ class CONTENT_EXPORT RendererGpuVideoAcceleratorFactories
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
const scoped_refptr<ContextProviderCommandBuffer>& context_provider, const scoped_refptr<ContextProviderCommandBuffer>& context_provider,
bool enable_gpu_memory_buffer_video_frames, bool enable_gpu_memory_buffer_video_frames,
unsigned image_texture_target, std::vector<unsigned> image_texture_targets,
bool enable_video_accelerator); bool enable_video_accelerator);
bool CheckContextLost(); bool CheckContextLost();
...@@ -119,7 +119,7 @@ class CONTENT_EXPORT RendererGpuVideoAcceleratorFactories ...@@ -119,7 +119,7 @@ class CONTENT_EXPORT RendererGpuVideoAcceleratorFactories
// Whether gpu memory buffers should be used to hold video frames data. // Whether gpu memory buffers should be used to hold video frames data.
bool enable_gpu_memory_buffer_video_frames_; bool enable_gpu_memory_buffer_video_frames_;
const unsigned image_texture_target_; const std::vector<unsigned> image_texture_targets_;
// Whether video acceleration encoding/decoding should be enabled. // Whether video acceleration encoding/decoding should be enabled.
const bool video_accelerator_enabled_; const bool video_accelerator_enabled_;
......
...@@ -1471,16 +1471,16 @@ media::GpuVideoAcceleratorFactories* RenderThreadImpl::GetGpuFactories() { ...@@ -1471,16 +1471,16 @@ media::GpuVideoAcceleratorFactories* RenderThreadImpl::GetGpuFactories() {
#else #else
cmd_line->HasSwitch(switches::kEnableGpuMemoryBufferVideoFrames); cmd_line->HasSwitch(switches::kEnableGpuMemoryBufferVideoFrames);
#endif #endif
std::string image_texture_target_string = std::vector<unsigned> image_texture_targets;
std::string video_frame_image_texture_target_string =
cmd_line->GetSwitchValueASCII(switches::kVideoImageTextureTarget); cmd_line->GetSwitchValueASCII(switches::kVideoImageTextureTarget);
unsigned image_texture_target = 0; StringToUintVector(video_frame_image_texture_target_string,
const bool parsed_image_texture_target = &image_texture_targets);
base::StringToUint(image_texture_target_string, &image_texture_target);
DCHECK(parsed_image_texture_target);
gpu_factories_ = RendererGpuVideoAcceleratorFactories::Create( gpu_factories_ = RendererGpuVideoAcceleratorFactories::Create(
gpu_channel_host.get(), base::ThreadTaskRunnerHandle::Get(), gpu_channel_host.get(), base::ThreadTaskRunnerHandle::Get(),
media_task_runner, shared_context_provider, media_task_runner, shared_context_provider,
enable_gpu_memory_buffer_video_frames, image_texture_target, enable_gpu_memory_buffer_video_frames, image_texture_targets,
enable_video_accelerator); enable_video_accelerator);
} }
return gpu_factories_.get(); return gpu_factories_.get();
......
...@@ -661,6 +661,7 @@ class CONTENT_EXPORT RenderThreadImpl ...@@ -661,6 +661,7 @@ class CONTENT_EXPORT RenderThreadImpl
bool is_partial_raster_enabled_; bool is_partial_raster_enabled_;
bool is_elastic_overscroll_enabled_; bool is_elastic_overscroll_enabled_;
std::vector<unsigned> use_image_texture_targets_; std::vector<unsigned> use_image_texture_targets_;
std::vector<unsigned> use_video_frame_image_texture_targets_;
bool are_image_decode_tasks_enabled_; bool are_image_decode_tasks_enabled_;
bool is_threaded_animation_enabled_; bool is_threaded_animation_enabled_;
......
...@@ -87,7 +87,7 @@ class MEDIA_EXPORT GpuVideoAcceleratorFactories { ...@@ -87,7 +87,7 @@ class MEDIA_EXPORT GpuVideoAcceleratorFactories {
gfx::BufferUsage usage) = 0; gfx::BufferUsage usage) = 0;
virtual bool ShouldUseGpuMemoryBuffersForVideoFrames() const = 0; virtual bool ShouldUseGpuMemoryBuffersForVideoFrames() const = 0;
virtual unsigned ImageTextureTarget() = 0; virtual unsigned ImageTextureTarget(gfx::BufferFormat format) = 0;
// Pixel format of the hardware video frames created when GpuMemoryBuffers // Pixel format of the hardware video frames created when GpuMemoryBuffers
// video frames are enabled. // video frames are enabled.
virtual VideoPixelFormat VideoFrameOutputFormat() = 0; virtual VideoPixelFormat VideoFrameOutputFormat() = 0;
......
...@@ -128,7 +128,8 @@ bool MockGpuVideoAcceleratorFactories::ShouldUseGpuMemoryBuffersForVideoFrames() ...@@ -128,7 +128,8 @@ bool MockGpuVideoAcceleratorFactories::ShouldUseGpuMemoryBuffersForVideoFrames()
return false; return false;
} }
unsigned MockGpuVideoAcceleratorFactories::ImageTextureTarget() { unsigned MockGpuVideoAcceleratorFactories::ImageTextureTarget(
gfx::BufferFormat format) {
return GL_TEXTURE_2D; return GL_TEXTURE_2D;
} }
......
...@@ -54,7 +54,7 @@ class MockGpuVideoAcceleratorFactories : public GpuVideoAcceleratorFactories { ...@@ -54,7 +54,7 @@ class MockGpuVideoAcceleratorFactories : public GpuVideoAcceleratorFactories {
gfx::BufferUsage usage) override; gfx::BufferUsage usage) override;
bool ShouldUseGpuMemoryBuffersForVideoFrames() const override; bool ShouldUseGpuMemoryBuffersForVideoFrames() const override;
unsigned ImageTextureTarget() override; unsigned ImageTextureTarget(gfx::BufferFormat format) override;
VideoPixelFormat VideoFrameOutputFormat() override { VideoPixelFormat VideoFrameOutputFormat() override {
return video_frame_output_format_; return video_frame_output_format_;
}; };
......
...@@ -49,7 +49,6 @@ class GpuMemoryBufferVideoFramePool::PoolImpl ...@@ -49,7 +49,6 @@ class GpuMemoryBufferVideoFramePool::PoolImpl
: media_task_runner_(media_task_runner), : media_task_runner_(media_task_runner),
worker_task_runner_(worker_task_runner), worker_task_runner_(worker_task_runner),
gpu_factories_(gpu_factories), gpu_factories_(gpu_factories),
texture_target_(gpu_factories->ImageTextureTarget()),
output_format_(PIXEL_FORMAT_UNKNOWN) { output_format_(PIXEL_FORMAT_UNKNOWN) {
DCHECK(media_task_runner_); DCHECK(media_task_runner_);
DCHECK(worker_task_runner_); DCHECK(worker_task_runner_);
...@@ -164,7 +163,6 @@ class GpuMemoryBufferVideoFramePool::PoolImpl ...@@ -164,7 +163,6 @@ class GpuMemoryBufferVideoFramePool::PoolImpl
// Pool of resources. // Pool of resources.
std::list<FrameResources*> resources_pool_; std::list<FrameResources*> resources_pool_;
const unsigned texture_target_;
// TODO(dcastagna): change the following type from VideoPixelFormat to // TODO(dcastagna): change the following type from VideoPixelFormat to
// BufferFormat. // BufferFormat.
VideoPixelFormat output_format_; VideoPixelFormat output_format_;
...@@ -555,8 +553,11 @@ void GpuMemoryBufferVideoFramePool::PoolImpl:: ...@@ -555,8 +553,11 @@ void GpuMemoryBufferVideoFramePool::PoolImpl::
// Set up the planes creating the mailboxes needed to refer to the textures. // Set up the planes creating the mailboxes needed to refer to the textures.
for (size_t i = 0; i < num_planes; i += planes_per_copy) { for (size_t i = 0; i < num_planes; i += planes_per_copy) {
PlaneResource& plane_resource = frame_resources->plane_resources[i]; PlaneResource& plane_resource = frame_resources->plane_resources[i];
const gfx::BufferFormat buffer_format =
GpuMemoryBufferFormat(output_format_, i);
unsigned texture_target = gpu_factories_->ImageTextureTarget(buffer_format);
// Bind the texture and create or rebind the image. // Bind the texture and create or rebind the image.
gles2->BindTexture(texture_target_, plane_resource.texture_id); gles2->BindTexture(texture_target, plane_resource.texture_id);
if (plane_resource.gpu_memory_buffer && !plane_resource.image_id) { if (plane_resource.gpu_memory_buffer && !plane_resource.image_id) {
const size_t width = const size_t width =
...@@ -567,13 +568,12 @@ void GpuMemoryBufferVideoFramePool::PoolImpl:: ...@@ -567,13 +568,12 @@ void GpuMemoryBufferVideoFramePool::PoolImpl::
plane_resource.gpu_memory_buffer->AsClientBuffer(), width, height, plane_resource.gpu_memory_buffer->AsClientBuffer(), width, height,
ImageInternalFormat(output_format_, i)); ImageInternalFormat(output_format_, i));
} else if (plane_resource.image_id) { } else if (plane_resource.image_id) {
gles2->ReleaseTexImage2DCHROMIUM(texture_target_, gles2->ReleaseTexImage2DCHROMIUM(texture_target, plane_resource.image_id);
plane_resource.image_id);
} }
if (plane_resource.image_id) if (plane_resource.image_id)
gles2->BindTexImage2DCHROMIUM(texture_target_, plane_resource.image_id); gles2->BindTexImage2DCHROMIUM(texture_target, plane_resource.image_id);
mailbox_holders[i] = gpu::MailboxHolder(plane_resource.mailbox, mailbox_holders[i] = gpu::MailboxHolder(plane_resource.mailbox,
gpu::SyncToken(), texture_target_); gpu::SyncToken(), texture_target);
} }
// Insert a sync_token, this is needed to make sure that the textures the // Insert a sync_token, this is needed to make sure that the textures the
...@@ -693,14 +693,15 @@ GpuMemoryBufferVideoFramePool::PoolImpl::GetOrCreateFrameResources( ...@@ -693,14 +693,15 @@ GpuMemoryBufferVideoFramePool::PoolImpl::GetOrCreateFrameResources(
plane_resource.size, buffer_format, plane_resource.size, buffer_format,
gfx::BufferUsage::GPU_READ_CPU_READ_WRITE); gfx::BufferUsage::GPU_READ_CPU_READ_WRITE);
unsigned texture_target = gpu_factories_->ImageTextureTarget(buffer_format);
gles2->GenTextures(1, &plane_resource.texture_id); gles2->GenTextures(1, &plane_resource.texture_id);
gles2->BindTexture(texture_target_, plane_resource.texture_id); gles2->BindTexture(texture_target, plane_resource.texture_id);
gles2->TexParameteri(texture_target_, GL_TEXTURE_MIN_FILTER, GL_LINEAR); gles2->TexParameteri(texture_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
gles2->TexParameteri(texture_target_, GL_TEXTURE_MAG_FILTER, GL_LINEAR); gles2->TexParameteri(texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
gles2->TexParameteri(texture_target_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); gles2->TexParameteri(texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
gles2->TexParameteri(texture_target_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); gles2->TexParameteri(texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
gles2->GenMailboxCHROMIUM(plane_resource.mailbox.name); gles2->GenMailboxCHROMIUM(plane_resource.mailbox.name);
gles2->ProduceTextureCHROMIUM(texture_target_, plane_resource.mailbox.name); gles2->ProduceTextureCHROMIUM(texture_target, plane_resource.mailbox.name);
} }
return frame_resources; return frame_resources;
} }
......
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