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

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc

Issue 2844393004: Passthrough CmdDecoder: Reset unpack state on some TexImage (Closed)
Patch Set: 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 unified diff | Download patch
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2016 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 #include "gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h" 5 #include "gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h"
6 6
7 #include "base/strings/string_number_conversions.h" 7 #include "base/strings/string_number_conversions.h"
8 #include "ui/gl/gl_version_info.h" 8 #include "ui/gl/gl_version_info.h"
9 9
10 namespace gpu { 10 namespace gpu {
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 } 186 }
187 187
188 void AppendStringToBuffer(std::vector<uint8_t>* data, 188 void AppendStringToBuffer(std::vector<uint8_t>* data,
189 const char* str, 189 const char* str,
190 size_t len) { 190 size_t len) {
191 const base::CheckedNumeric<size_t> old_size = data->size(); 191 const base::CheckedNumeric<size_t> old_size = data->size();
192 data->resize((old_size + len).ValueOrDie()); 192 data->resize((old_size + len).ValueOrDie());
193 memcpy(data->data() + old_size.ValueOrDie(), str, len); 193 memcpy(data->data() + old_size.ValueOrDie(), str, len);
194 } 194 }
195 195
196 // In order to minimize the amount of data copied, the command buffer client
197 // unpack pixels before sending the glTex[Sub]Image[2|3]D calls. The only
198 // parameter it doesn't handle is the alignment. Resetting the unpack state is
199 // not needed when uploading from a PBO and for compressed formats which the
200 // client sends untouched. This class handles resetting and restoring the unpack
201 // state.
202 // TODO(cwallez@chromium.org) it would be nicer to handle the resetting /
203 // restoring on the client side.
204 class ScopedUnpackStateButAlignmentReset {
205 public:
206 ScopedUnpackStateButAlignmentReset(bool enable, bool is_3d) {
207 if (!enable) {
208 return;
209 }
210
211 glGetIntegerv(GL_UNPACK_SKIP_PIXELS, &skip_pixels_);
212 glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
213 glGetIntegerv(GL_UNPACK_SKIP_ROWS, &skip_rows_);
214 glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
215 glGetIntegerv(GL_UNPACK_ROW_LENGTH, &row_length_);
216 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
217
218 if (is_3d) {
219 glGetIntegerv(GL_UNPACK_SKIP_IMAGES, &skip_images_);
220 glPixelStorei(GL_UNPACK_SKIP_IMAGES, 0);
221 glGetIntegerv(GL_UNPACK_IMAGE_HEIGHT, &image_height_);
222 glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, 0);
223 }
224 }
225
226 ~ScopedUnpackStateButAlignmentReset() {
227 if (skip_pixels_ != 0) {
228 glPixelStorei(GL_UNPACK_SKIP_PIXELS, skip_pixels_);
229 }
230 if (skip_rows_ != 0) {
231 glPixelStorei(GL_UNPACK_SKIP_ROWS, skip_rows_);
232 }
233 if (skip_images_ != 0) {
234 glPixelStorei(GL_UNPACK_SKIP_IMAGES, skip_images_);
235 }
236 if (row_length_ != 0) {
237 glPixelStorei(GL_UNPACK_ROW_LENGTH, row_length_);
238 }
239 if (image_height_ != 0) {
240 glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, image_height_);
241 }
242 }
243
244 private:
245 GLint skip_pixels_ = 0;
246 GLint skip_rows_ = 0;
247 GLint skip_images_ = 0;
248 GLint row_length_ = 0;
249 GLint image_height_ = 0;
250 };
251
196 } // anonymous namespace 252 } // anonymous namespace
197 253
198 // Implementations of commands 254 // Implementations of commands
199 error::Error GLES2DecoderPassthroughImpl::DoActiveTexture(GLenum texture) { 255 error::Error GLES2DecoderPassthroughImpl::DoActiveTexture(GLenum texture) {
200 FlushErrors(); 256 FlushErrors();
201 glActiveTexture(texture); 257 glActiveTexture(texture);
202 if (FlushErrors()) { 258 if (FlushErrors()) {
203 return error::kNoError; 259 return error::kNoError;
204 } 260 }
205 261
(...skipping 1632 matching lines...) Expand 10 before | Expand all | Expand 10 after
1838 } 1894 }
1839 1895
1840 error::Error GLES2DecoderPassthroughImpl::DoTexImage2D(GLenum target, 1896 error::Error GLES2DecoderPassthroughImpl::DoTexImage2D(GLenum target,
1841 GLint level, 1897 GLint level,
1842 GLint internalformat, 1898 GLint internalformat,
1843 GLsizei width, 1899 GLsizei width,
1844 GLsizei height, 1900 GLsizei height,
1845 GLint border, 1901 GLint border,
1846 GLenum format, 1902 GLenum format,
1847 GLenum type, 1903 GLenum type,
1848 GLsizei imagesize, 1904 GLsizei image_size,
1849 const void* pixels) { 1905 const void* pixels) {
1906 ScopedUnpackStateButAlignmentReset reset_unpack(
1907 image_size != 0 && feature_info_->gl_version_info().is_es3, false);
1850 glTexImage2DRobustANGLE(target, level, internalformat, width, height, border, 1908 glTexImage2DRobustANGLE(target, level, internalformat, width, height, border,
1851 format, type, imagesize, pixels); 1909 format, type, image_size, pixels);
1852 return error::kNoError; 1910 return error::kNoError;
1853 } 1911 }
1854 1912
1855 error::Error GLES2DecoderPassthroughImpl::DoTexImage3D(GLenum target, 1913 error::Error GLES2DecoderPassthroughImpl::DoTexImage3D(GLenum target,
1856 GLint level, 1914 GLint level,
1857 GLint internalformat, 1915 GLint internalformat,
1858 GLsizei width, 1916 GLsizei width,
1859 GLsizei height, 1917 GLsizei height,
1860 GLsizei depth, 1918 GLsizei depth,
1861 GLint border, 1919 GLint border,
1862 GLenum format, 1920 GLenum format,
1863 GLenum type, 1921 GLenum type,
1864 GLsizei imagesize, 1922 GLsizei image_size,
1865 const void* pixels) { 1923 const void* pixels) {
1924 ScopedUnpackStateButAlignmentReset reset_unpack(
1925 image_size != 0 && feature_info_->gl_version_info().is_es3, true);
1866 glTexImage3DRobustANGLE(target, level, internalformat, width, height, depth, 1926 glTexImage3DRobustANGLE(target, level, internalformat, width, height, depth,
1867 border, format, type, imagesize, pixels); 1927 border, format, type, image_size, pixels);
1868 return error::kNoError; 1928 return error::kNoError;
1869 } 1929 }
1870 1930
1871 error::Error GLES2DecoderPassthroughImpl::DoTexParameterf(GLenum target, 1931 error::Error GLES2DecoderPassthroughImpl::DoTexParameterf(GLenum target,
1872 GLenum pname, 1932 GLenum pname,
1873 GLfloat param) { 1933 GLfloat param) {
1874 glTexParameterf(target, pname, param); 1934 glTexParameterf(target, pname, param);
1875 return error::kNoError; 1935 return error::kNoError;
1876 } 1936 }
1877 1937
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1915 } 1975 }
1916 1976
1917 error::Error GLES2DecoderPassthroughImpl::DoTexSubImage2D(GLenum target, 1977 error::Error GLES2DecoderPassthroughImpl::DoTexSubImage2D(GLenum target,
1918 GLint level, 1978 GLint level,
1919 GLint xoffset, 1979 GLint xoffset,
1920 GLint yoffset, 1980 GLint yoffset,
1921 GLsizei width, 1981 GLsizei width,
1922 GLsizei height, 1982 GLsizei height,
1923 GLenum format, 1983 GLenum format,
1924 GLenum type, 1984 GLenum type,
1925 GLsizei imagesize, 1985 GLsizei image_size,
1926 const void* pixels) { 1986 const void* pixels) {
1987 ScopedUnpackStateButAlignmentReset reset_unpack(
1988 image_size != 0 && feature_info_->gl_version_info().is_es3, false);
1927 glTexSubImage2DRobustANGLE(target, level, xoffset, yoffset, width, height, 1989 glTexSubImage2DRobustANGLE(target, level, xoffset, yoffset, width, height,
1928 format, type, imagesize, pixels); 1990 format, type, image_size, pixels);
1929 return error::kNoError; 1991 return error::kNoError;
1930 } 1992 }
1931 1993
1932 error::Error GLES2DecoderPassthroughImpl::DoTexSubImage3D(GLenum target, 1994 error::Error GLES2DecoderPassthroughImpl::DoTexSubImage3D(GLenum target,
1933 GLint level, 1995 GLint level,
1934 GLint xoffset, 1996 GLint xoffset,
1935 GLint yoffset, 1997 GLint yoffset,
1936 GLint zoffset, 1998 GLint zoffset,
1937 GLsizei width, 1999 GLsizei width,
1938 GLsizei height, 2000 GLsizei height,
1939 GLsizei depth, 2001 GLsizei depth,
1940 GLenum format, 2002 GLenum format,
1941 GLenum type, 2003 GLenum type,
1942 GLsizei imagesize, 2004 GLsizei image_size,
1943 const void* pixels) { 2005 const void* pixels) {
2006 ScopedUnpackStateButAlignmentReset reset_unpack(
2007 image_size != 0 && feature_info_->gl_version_info().is_es3, true);
1944 glTexSubImage3DRobustANGLE(target, level, xoffset, yoffset, zoffset, width, 2008 glTexSubImage3DRobustANGLE(target, level, xoffset, yoffset, zoffset, width,
1945 height, depth, format, type, imagesize, pixels); 2009 height, depth, format, type, image_size, pixels);
1946 return error::kNoError; 2010 return error::kNoError;
1947 } 2011 }
1948 2012
1949 error::Error GLES2DecoderPassthroughImpl::DoTransformFeedbackVaryings( 2013 error::Error GLES2DecoderPassthroughImpl::DoTransformFeedbackVaryings(
1950 GLuint program, 2014 GLuint program,
1951 GLsizei count, 2015 GLsizei count,
1952 const char** varyings, 2016 const char** varyings,
1953 GLenum buffermode) { 2017 GLenum buffermode) {
1954 glTransformFeedbackVaryings(GetProgramServiceID(program, resources_), count, 2018 glTransformFeedbackVaryings(GetProgramServiceID(program, resources_), count,
1955 varyings, buffermode); 2019 varyings, buffermode);
(...skipping 2017 matching lines...) Expand 10 before | Expand all | Expand 10 after
3973 } 4037 }
3974 4038
3975 error::Error GLES2DecoderPassthroughImpl::DoSetEnableDCLayersCHROMIUM( 4039 error::Error GLES2DecoderPassthroughImpl::DoSetEnableDCLayersCHROMIUM(
3976 GLboolean enable) { 4040 GLboolean enable) {
3977 NOTIMPLEMENTED(); 4041 NOTIMPLEMENTED();
3978 return error::kNoError; 4042 return error::kNoError;
3979 } 4043 }
3980 4044
3981 } // namespace gles2 4045 } // namespace gles2
3982 } // namespace gpu 4046 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698