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

Side by Side Diff: ui/surface/accelerated_surface_transformer_win.h

Issue 11280318: YUV conversion on the GPU. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Test improvements. Created 7 years, 12 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef UI_SURFACE_ACCELERATED_SURFACE_TRANSFORMER_WIN_H_ 5 #ifndef UI_SURFACE_ACCELERATED_SURFACE_TRANSFORMER_WIN_H_
6 #define UI_SURFACE_ACCELERATED_SURFACE_TRANSFORMER_WIN_H_ 6 #define UI_SURFACE_ACCELERATED_SURFACE_TRANSFORMER_WIN_H_
7 7
8 #include <d3d9.h> 8 #include <d3d9.h>
9 9
10 #include "base/memory/ref_counted.h" 10 #include "base/memory/ref_counted.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 IDirect3DTexture9* src_texture, 49 IDirect3DTexture9* src_texture,
50 IDirect3DSurface9* dst_surface, 50 IDirect3DSurface9* dst_surface,
51 const gfx::Size& dst_size); 51 const gfx::Size& dst_size);
52 52
53 // Resize a surface using repeated bilinear interpolation. 53 // Resize a surface using repeated bilinear interpolation.
54 bool ResizeBilinear( 54 bool ResizeBilinear(
55 IDirect3DSurface9* src_surface, 55 IDirect3DSurface9* src_surface,
56 const gfx::Rect& src_subrect, 56 const gfx::Rect& src_subrect,
57 IDirect3DSurface9* dst_surface); 57 IDirect3DSurface9* dst_surface);
58 58
59 // Color format conversion from RGB to planar YV12 (also known as YUV420).
60 //
61 // YV12 is effectively a twelve bit per pixel format consisting of a full-
62 // size y (luminance) plane and half-width, half-height u and v (blue and
63 // red chrominance) planes. This method will allocate three lockable surfaces,
64 // one for each plane, and return them via the arguments |dst_y|, |dst_u|,
65 // and |dst_v|. These surface will be created with an ARGB D3DFORMAT, but
66 // should be interpreted as the appropriate single-byte format when locking.
67 //
68 // The dimensions of the outputs (when interpreted as single-component data)
69 // are as follows:
70 // |dst_y| : width and height exactly |dst_size|
71 // |dst_u| : width and height are each half of |dst_size|, rounded up.
72 // |dst_v| : width and height are each half of |dst_size|, rounded up.
73 //
74 // If |src_texture|'s dimensions do not match |dst_size|, the source will be
75 // bilinearly interpolated during conversion.
76 //
77 // Returns true if successful. Caller must be certain to free the buffers
78 // even if this function returns false.
79 bool TransformRGBToYV12(
80 IDirect3DTexture9* src_texture,
81 const gfx::Size& dst_size,
82 IDirect3DSurface9** dst_y,
83 IDirect3DSurface9** dst_u,
84 IDirect3DSurface9** dst_v);
85
59 private: 86 private:
87 friend class AcceleratedSurfaceTransformerTest;
88
60 enum ShaderCombo { 89 enum ShaderCombo {
61 SIMPLE_TEXTURE, 90 ONE_TEXTURE_FLIP_Y,
91 RGB_TO_YV12_FAST__PASS_1_OF_2,
92 RGB_TO_YV12_FAST__PASS_2_OF_2,
93 RGB_TO_YV12_SLOW__PASS_1_OF_3,
94 RGB_TO_YV12_SLOW__PASS_2_OF_3,
95 RGB_TO_YV12_SLOW__PASS_3_OF_3,
62 NUM_SHADERS 96 NUM_SHADERS
63 }; 97 };
64 98
99 // Efficient RGB->YV12 in two passes, but requires a device capable of writing
100 // multiple render targets at the same time.
101 //
102 // Returns true if successful.
103 bool TransformRGBToYV12_MRT(
104 IDirect3DTexture9* src_surface,
105 const gfx::Size& dst_size,
106 const gfx::Size& packed_y_size,
107 const gfx::Size& packed_uv_size,
108 IDirect3DSurface9* dst_y,
109 IDirect3DSurface9* dst_u,
110 IDirect3DSurface9* dst_v);
111
112 // Slower, less efficient RGB->YV12; does not require the device to have
113 // multiple render target capability. Runs at about half speed of the fast
114 // path.
115 //
116 // Returns true if successful.
117 bool TransformRGBToYV12_WithoutMRT(
118 IDirect3DTexture9* src_surface,
119 const gfx::Size& dst_size,
120 const gfx::Size& packed_y_size,
121 const gfx::Size& packed_uv_size,
122 IDirect3DSurface9* dst_y,
123 IDirect3DSurface9* dst_u,
124 IDirect3DSurface9* dst_v);
125
126 // Helper to allocate appropriately size YUV buffers, accounting for various
127 // roundings. The sizes of the buffers (in terms of ARGB pixels) are returned
128 // as |packed_y_size| and |packed_uv_size|.
129 //
130 // Returns true if successful. Caller must be certain to free the buffers
131 // even if this function returns false.
132 bool AllocYUVBuffers(
133 const gfx::Size& dst_size,
134 gfx::Size* packed_y_size,
135 gfx::Size* packed_uv_size,
136 IDirect3DSurface9** dst_y,
137 IDirect3DSurface9** dst_u,
138 IDirect3DSurface9** dst_v);
139
65 // Set the active vertex and pixel shader combination. 140 // Set the active vertex and pixel shader combination.
141 //
142 // Returns true if successful.
66 bool SetShaderCombo(ShaderCombo combo); 143 bool SetShaderCombo(ShaderCombo combo);
67 144
68 // Intitializes a vertex and pixel shader combination from compiled bytecode. 145 // Intitializes a vertex and pixel shader combination from compiled bytecode.
69 bool InitShaderCombo(const BYTE vertex_shader_instructions[], 146 //
70 const BYTE pixel_shader_instructions[], 147 // Returns true if successful.
71 ShaderCombo shader_combo_name); 148 bool InitShaderCombo(ShaderCombo shader_combo_name,
149 const BYTE vertex_shader_instructions[],
150 const BYTE pixel_shader_instructions[]);
72 151
152 bool DoInit(IDirect3DDevice9* device);
153
154 void DrawScreenAlignedQuad(const gfx::Size& dst_size);
155
156 bool device_supports_multiple_render_targets();
miu 2012/12/27 21:40:17 nit: const method, since this is just a simple get
ncarter (slow) 2013/01/07 22:49:10 Done.
73 IDirect3DDevice9* device(); 157 IDirect3DDevice9* device();
74 158
75 base::win::ScopedComPtr<IDirect3DDevice9> device_; 159 base::win::ScopedComPtr<IDirect3DDevice9> device_;
76 base::win::ScopedComPtr<IDirect3DVertexShader9> vertex_shaders_[NUM_SHADERS]; 160 base::win::ScopedComPtr<IDirect3DVertexShader9> vertex_shaders_[NUM_SHADERS];
77 base::win::ScopedComPtr<IDirect3DPixelShader9> pixel_shaders_[NUM_SHADERS]; 161 base::win::ScopedComPtr<IDirect3DPixelShader9> pixel_shaders_[NUM_SHADERS];
162 bool device_supports_multiple_render_targets_;
78 DISALLOW_COPY_AND_ASSIGN(AcceleratedSurfaceTransformer); 163 DISALLOW_COPY_AND_ASSIGN(AcceleratedSurfaceTransformer);
79 }; 164 };
80 165
81 #endif // UI_SURFACE_ACCELERATED_SURFACE_TRANSFORMER_WIN_H_ 166 #endif // UI_SURFACE_ACCELERATED_SURFACE_TRANSFORMER_WIN_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698