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) {
// 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
// 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 =
IsPartialRasterEnabled()
? gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT
......@@ -1298,10 +1301,15 @@ static void AppendCompositorCommandLineFlags(base::CommandLine* command_line) {
command_line->AppendSwitchASCII(switches::kContentImageTextureTarget,
UintVectorToString(image_targets));
command_line->AppendSwitchASCII(
switches::kVideoImageTextureTarget,
base::UintToString(BrowserGpuMemoryBufferManager::GetImageTextureTarget(
gfx::BufferFormat::R_8, gfx::BufferUsage::GPU_READ_CPU_READ_WRITE)));
for (size_t format = 0;
format < static_cast<size_t>(gfx::BufferFormat::LAST) + 1; format++) {
image_targets[format] =
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.
GpuDataManagerImpl* gpu_data_manager = GpuDataManagerImpl::GetInstance();
......
......@@ -32,11 +32,11 @@ RendererGpuVideoAcceleratorFactories::Create(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
const scoped_refptr<ContextProviderCommandBuffer>& context_provider,
bool enable_gpu_memory_buffer_video_frames,
unsigned image_texture_target,
std::vector<unsigned> image_texture_targets,
bool enable_video_accelerator) {
return make_scoped_ptr(new RendererGpuVideoAcceleratorFactories(
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));
}
......@@ -46,7 +46,7 @@ RendererGpuVideoAcceleratorFactories::RendererGpuVideoAcceleratorFactories(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
const scoped_refptr<ContextProviderCommandBuffer>& context_provider,
bool enable_gpu_memory_buffer_video_frames,
unsigned image_texture_target,
std::vector<unsigned> image_texture_targets,
bool enable_video_accelerator)
: main_thread_task_runner_(main_thread_task_runner),
task_runner_(task_runner),
......@@ -55,7 +55,7 @@ RendererGpuVideoAcceleratorFactories::RendererGpuVideoAcceleratorFactories(
context_provider_(context_provider.get()),
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),
gpu_memory_buffer_manager_(ChildThreadImpl::current()
->gpu_memory_buffer_manager()),
......@@ -194,8 +194,9 @@ bool RendererGpuVideoAcceleratorFactories::
return enable_gpu_memory_buffer_video_frames_;
}
unsigned RendererGpuVideoAcceleratorFactories::ImageTextureTarget() {
return image_texture_target_;
unsigned RendererGpuVideoAcceleratorFactories::ImageTextureTarget(
gfx::BufferFormat format) {
return image_texture_targets_[static_cast<int>(format)];
}
media::VideoPixelFormat
......
......@@ -52,7 +52,7 @@ class CONTENT_EXPORT RendererGpuVideoAcceleratorFactories
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
const scoped_refptr<ContextProviderCommandBuffer>& context_provider,
bool enable_gpu_memory_buffer_video_frames,
unsigned image_texture_target,
std::vector<unsigned> image_texture_targets,
bool enable_video_accelerator);
// media::GpuVideoAcceleratorFactories implementation.
......@@ -77,7 +77,7 @@ class CONTENT_EXPORT RendererGpuVideoAcceleratorFactories
gfx::BufferUsage usage) override;
bool ShouldUseGpuMemoryBuffersForVideoFrames() const override;
unsigned ImageTextureTarget() override;
unsigned ImageTextureTarget(gfx::BufferFormat format) override;
media::VideoPixelFormat VideoFrameOutputFormat() override;
scoped_ptr<media::GpuVideoAcceleratorFactories::ScopedGLContextLock>
GetGLContextLock() override;
......@@ -101,7 +101,7 @@ class CONTENT_EXPORT RendererGpuVideoAcceleratorFactories
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
const scoped_refptr<ContextProviderCommandBuffer>& context_provider,
bool enable_gpu_memory_buffer_video_frames,
unsigned image_texture_target,
std::vector<unsigned> image_texture_targets,
bool enable_video_accelerator);
bool CheckContextLost();
......@@ -119,7 +119,7 @@ class CONTENT_EXPORT RendererGpuVideoAcceleratorFactories
// Whether gpu memory buffers should be used to hold video frames data.
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.
const bool video_accelerator_enabled_;
......
......@@ -1471,16 +1471,16 @@ media::GpuVideoAcceleratorFactories* RenderThreadImpl::GetGpuFactories() {
#else
cmd_line->HasSwitch(switches::kEnableGpuMemoryBufferVideoFrames);
#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);
unsigned image_texture_target = 0;
const bool parsed_image_texture_target =
base::StringToUint(image_texture_target_string, &image_texture_target);
DCHECK(parsed_image_texture_target);
StringToUintVector(video_frame_image_texture_target_string,
&image_texture_targets);
gpu_factories_ = RendererGpuVideoAcceleratorFactories::Create(
gpu_channel_host.get(), base::ThreadTaskRunnerHandle::Get(),
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);
}
return gpu_factories_.get();
......
......@@ -661,6 +661,7 @@ class CONTENT_EXPORT RenderThreadImpl
bool is_partial_raster_enabled_;
bool is_elastic_overscroll_enabled_;
std::vector<unsigned> use_image_texture_targets_;
std::vector<unsigned> use_video_frame_image_texture_targets_;
bool are_image_decode_tasks_enabled_;
bool is_threaded_animation_enabled_;
......
......@@ -87,7 +87,7 @@ class MEDIA_EXPORT GpuVideoAcceleratorFactories {
gfx::BufferUsage usage) = 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
// video frames are enabled.
virtual VideoPixelFormat VideoFrameOutputFormat() = 0;
......
......@@ -128,7 +128,8 @@ bool MockGpuVideoAcceleratorFactories::ShouldUseGpuMemoryBuffersForVideoFrames()
return false;
}
unsigned MockGpuVideoAcceleratorFactories::ImageTextureTarget() {
unsigned MockGpuVideoAcceleratorFactories::ImageTextureTarget(
gfx::BufferFormat format) {
return GL_TEXTURE_2D;
}
......
......@@ -54,7 +54,7 @@ class MockGpuVideoAcceleratorFactories : public GpuVideoAcceleratorFactories {
gfx::BufferUsage usage) override;
bool ShouldUseGpuMemoryBuffersForVideoFrames() const override;
unsigned ImageTextureTarget() override;
unsigned ImageTextureTarget(gfx::BufferFormat format) override;
VideoPixelFormat VideoFrameOutputFormat() override {
return video_frame_output_format_;
};
......
......@@ -49,7 +49,6 @@ class GpuMemoryBufferVideoFramePool::PoolImpl
: media_task_runner_(media_task_runner),
worker_task_runner_(worker_task_runner),
gpu_factories_(gpu_factories),
texture_target_(gpu_factories->ImageTextureTarget()),
output_format_(PIXEL_FORMAT_UNKNOWN) {
DCHECK(media_task_runner_);
DCHECK(worker_task_runner_);
......@@ -164,7 +163,6 @@ class GpuMemoryBufferVideoFramePool::PoolImpl
// Pool of resources.
std::list<FrameResources*> resources_pool_;
const unsigned texture_target_;
// TODO(dcastagna): change the following type from VideoPixelFormat to
// BufferFormat.
VideoPixelFormat output_format_;
......@@ -555,8 +553,11 @@ void GpuMemoryBufferVideoFramePool::PoolImpl::
// 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) {
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.
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) {
const size_t width =
......@@ -567,13 +568,12 @@ void GpuMemoryBufferVideoFramePool::PoolImpl::
plane_resource.gpu_memory_buffer->AsClientBuffer(), width, height,
ImageInternalFormat(output_format_, i));
} else if (plane_resource.image_id) {
gles2->ReleaseTexImage2DCHROMIUM(texture_target_,
plane_resource.image_id);
gles2->ReleaseTexImage2DCHROMIUM(texture_target, 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,
gpu::SyncToken(), texture_target_);
gpu::SyncToken(), texture_target);
}
// Insert a sync_token, this is needed to make sure that the textures the
......@@ -693,14 +693,15 @@ GpuMemoryBufferVideoFramePool::PoolImpl::GetOrCreateFrameResources(
plane_resource.size, buffer_format,
gfx::BufferUsage::GPU_READ_CPU_READ_WRITE);
unsigned texture_target = gpu_factories_->ImageTextureTarget(buffer_format);
gles2->GenTextures(1, &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_MAG_FILTER, GL_LINEAR);
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->BindTexture(texture_target, plane_resource.texture_id);
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_WRAP_S, GL_CLAMP_TO_EDGE);
gles2->TexParameteri(texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
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;
}
......
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