| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2009 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 554 , m_onePlusMaxEnabledAttribIndex(0) | 554 , m_onePlusMaxEnabledAttribIndex(0) |
| 555 , m_onePlusMaxNonDefaultTextureUnit(0) | 555 , m_onePlusMaxNonDefaultTextureUnit(0) |
| 556 { | 556 { |
| 557 ASSERT(m_context); | 557 ASSERT(m_context); |
| 558 ScriptWrappable::init(this); | 558 ScriptWrappable::init(this); |
| 559 | 559 |
| 560 m_contextGroup = WebGLContextGroup::create(); | 560 m_contextGroup = WebGLContextGroup::create(); |
| 561 m_contextGroup->addContext(this); | 561 m_contextGroup->addContext(this); |
| 562 | 562 |
| 563 m_maxViewportDims[0] = m_maxViewportDims[1] = 0; | 563 m_maxViewportDims[0] = m_maxViewportDims[1] = 0; |
| 564 m_context->getIntegerv(GraphicsContext3D::MAX_VIEWPORT_DIMS, m_maxViewportDi
ms); | 564 m_context->getIntegerv(GL_MAX_VIEWPORT_DIMS, m_maxViewportDims); |
| 565 | 565 |
| 566 RefPtr<WebGLRenderingContextEvictionManager> contextEvictionManager = adoptR
ef(new WebGLRenderingContextEvictionManager()); | 566 RefPtr<WebGLRenderingContextEvictionManager> contextEvictionManager = adoptR
ef(new WebGLRenderingContextEvictionManager()); |
| 567 | 567 |
| 568 // Create the DrawingBuffer and initialize the platform layer. | 568 // Create the DrawingBuffer and initialize the platform layer. |
| 569 DrawingBuffer::PreserveDrawingBuffer preserve = m_attributes.preserveDrawing
Buffer ? DrawingBuffer::Preserve : DrawingBuffer::Discard; | 569 DrawingBuffer::PreserveDrawingBuffer preserve = m_attributes.preserveDrawing
Buffer ? DrawingBuffer::Preserve : DrawingBuffer::Discard; |
| 570 m_drawingBuffer = DrawingBuffer::create(m_context.get(), clampedCanvasSize()
, preserve, contextEvictionManager.release()); | 570 m_drawingBuffer = DrawingBuffer::create(m_context.get(), clampedCanvasSize()
, preserve, contextEvictionManager.release()); |
| 571 | 571 |
| 572 if (!m_drawingBuffer->isZeroSized()) { | 572 if (!m_drawingBuffer->isZeroSized()) { |
| 573 m_drawingBuffer->bind(); | 573 m_drawingBuffer->bind(); |
| 574 setupFlags(); | 574 setupFlags(); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 void WebGLRenderingContext::initializeNewContext() | 606 void WebGLRenderingContext::initializeNewContext() |
| 607 { | 607 { |
| 608 ASSERT(!isContextLost()); | 608 ASSERT(!isContextLost()); |
| 609 m_needsUpdate = true; | 609 m_needsUpdate = true; |
| 610 m_markedCanvasDirty = false; | 610 m_markedCanvasDirty = false; |
| 611 m_activeTextureUnit = 0; | 611 m_activeTextureUnit = 0; |
| 612 m_packAlignment = 4; | 612 m_packAlignment = 4; |
| 613 m_unpackAlignment = 4; | 613 m_unpackAlignment = 4; |
| 614 m_unpackFlipY = false; | 614 m_unpackFlipY = false; |
| 615 m_unpackPremultiplyAlpha = false; | 615 m_unpackPremultiplyAlpha = false; |
| 616 m_unpackColorspaceConversion = GraphicsContext3D::BROWSER_DEFAULT_WEBGL; | 616 m_unpackColorspaceConversion = GC3D_BROWSER_DEFAULT_WEBGL; |
| 617 m_boundArrayBuffer = 0; | 617 m_boundArrayBuffer = 0; |
| 618 m_currentProgram = 0; | 618 m_currentProgram = 0; |
| 619 m_framebufferBinding = 0; | 619 m_framebufferBinding = 0; |
| 620 m_renderbufferBinding = 0; | 620 m_renderbufferBinding = 0; |
| 621 m_depthMask = true; | 621 m_depthMask = true; |
| 622 m_stencilEnabled = false; | 622 m_stencilEnabled = false; |
| 623 m_stencilMask = 0xFFFFFFFF; | 623 m_stencilMask = 0xFFFFFFFF; |
| 624 m_stencilMaskBack = 0xFFFFFFFF; | 624 m_stencilMaskBack = 0xFFFFFFFF; |
| 625 m_stencilFuncRef = 0; | 625 m_stencilFuncRef = 0; |
| 626 m_stencilFuncRefBack = 0; | 626 m_stencilFuncRefBack = 0; |
| 627 m_stencilFuncMask = 0xFFFFFFFF; | 627 m_stencilFuncMask = 0xFFFFFFFF; |
| 628 m_stencilFuncMaskBack = 0xFFFFFFFF; | 628 m_stencilFuncMaskBack = 0xFFFFFFFF; |
| 629 m_layerCleared = false; | 629 m_layerCleared = false; |
| 630 m_numGLErrorsToConsoleAllowed = maxGLErrorsAllowedToConsole; | 630 m_numGLErrorsToConsoleAllowed = maxGLErrorsAllowedToConsole; |
| 631 | 631 |
| 632 m_clearColor[0] = m_clearColor[1] = m_clearColor[2] = m_clearColor[3] = 0; | 632 m_clearColor[0] = m_clearColor[1] = m_clearColor[2] = m_clearColor[3] = 0; |
| 633 m_scissorEnabled = false; | 633 m_scissorEnabled = false; |
| 634 m_clearDepth = 1; | 634 m_clearDepth = 1; |
| 635 m_clearStencil = 0; | 635 m_clearStencil = 0; |
| 636 m_colorMask[0] = m_colorMask[1] = m_colorMask[2] = m_colorMask[3] = true; | 636 m_colorMask[0] = m_colorMask[1] = m_colorMask[2] = m_colorMask[3] = true; |
| 637 | 637 |
| 638 GC3Dint numCombinedTextureImageUnits = 0; | 638 GC3Dint numCombinedTextureImageUnits = 0; |
| 639 m_context->getIntegerv(GraphicsContext3D::MAX_COMBINED_TEXTURE_IMAGE_UNITS,
&numCombinedTextureImageUnits); | 639 m_context->getIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &numCombinedText
ureImageUnits); |
| 640 m_textureUnits.clear(); | 640 m_textureUnits.clear(); |
| 641 m_textureUnits.resize(numCombinedTextureImageUnits); | 641 m_textureUnits.resize(numCombinedTextureImageUnits); |
| 642 | 642 |
| 643 GC3Dint numVertexAttribs = 0; | 643 GC3Dint numVertexAttribs = 0; |
| 644 m_context->getIntegerv(GraphicsContext3D::MAX_VERTEX_ATTRIBS, &numVertexAttr
ibs); | 644 m_context->getIntegerv(GL_MAX_VERTEX_ATTRIBS, &numVertexAttribs); |
| 645 m_maxVertexAttribs = numVertexAttribs; | 645 m_maxVertexAttribs = numVertexAttribs; |
| 646 | 646 |
| 647 m_maxTextureSize = 0; | 647 m_maxTextureSize = 0; |
| 648 m_context->getIntegerv(GraphicsContext3D::MAX_TEXTURE_SIZE, &m_maxTextureSiz
e); | 648 m_context->getIntegerv(GL_MAX_TEXTURE_SIZE, &m_maxTextureSize); |
| 649 m_maxTextureLevel = WebGLTexture::computeLevelCount(m_maxTextureSize, m_maxT
extureSize); | 649 m_maxTextureLevel = WebGLTexture::computeLevelCount(m_maxTextureSize, m_maxT
extureSize); |
| 650 m_maxCubeMapTextureSize = 0; | 650 m_maxCubeMapTextureSize = 0; |
| 651 m_context->getIntegerv(GraphicsContext3D::MAX_CUBE_MAP_TEXTURE_SIZE, &m_maxC
ubeMapTextureSize); | 651 m_context->getIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &m_maxCubeMapTextureSiz
e); |
| 652 m_maxCubeMapTextureLevel = WebGLTexture::computeLevelCount(m_maxCubeMapTextu
reSize, m_maxCubeMapTextureSize); | 652 m_maxCubeMapTextureLevel = WebGLTexture::computeLevelCount(m_maxCubeMapTextu
reSize, m_maxCubeMapTextureSize); |
| 653 m_maxRenderbufferSize = 0; | 653 m_maxRenderbufferSize = 0; |
| 654 m_context->getIntegerv(GraphicsContext3D::MAX_RENDERBUFFER_SIZE, &m_maxRende
rbufferSize); | 654 m_context->getIntegerv(GL_MAX_RENDERBUFFER_SIZE, &m_maxRenderbufferSize); |
| 655 | 655 |
| 656 // These two values from EXT_draw_buffers are lazily queried. | 656 // These two values from EXT_draw_buffers are lazily queried. |
| 657 m_maxDrawBuffers = 0; | 657 m_maxDrawBuffers = 0; |
| 658 m_maxColorAttachments = 0; | 658 m_maxColorAttachments = 0; |
| 659 | 659 |
| 660 m_backDrawBuffer = GraphicsContext3D::BACK; | 660 m_backDrawBuffer = GL_BACK; |
| 661 | 661 |
| 662 m_defaultVertexArrayObject = WebGLVertexArrayObjectOES::create(this, WebGLVe
rtexArrayObjectOES::VaoTypeDefault); | 662 m_defaultVertexArrayObject = WebGLVertexArrayObjectOES::create(this, WebGLVe
rtexArrayObjectOES::VaoTypeDefault); |
| 663 addContextObject(m_defaultVertexArrayObject.get()); | 663 addContextObject(m_defaultVertexArrayObject.get()); |
| 664 m_boundVertexArrayObject = m_defaultVertexArrayObject; | 664 m_boundVertexArrayObject = m_defaultVertexArrayObject; |
| 665 | 665 |
| 666 m_vertexAttribValue.resize(m_maxVertexAttribs); | 666 m_vertexAttribValue.resize(m_maxVertexAttribs); |
| 667 | 667 |
| 668 createFallbackBlackTextures1x1(); | 668 createFallbackBlackTextures1x1(); |
| 669 | 669 |
| 670 IntSize canvasSize = clampedCanvasSize(); | 670 IntSize canvasSize = clampedCanvasSize(); |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 810 | 810 |
| 811 if (!m_context->layerComposited() || m_layerCleared | 811 if (!m_context->layerComposited() || m_layerCleared |
| 812 || m_attributes.preserveDrawingBuffer || (mask && m_framebufferBinding)) | 812 || m_attributes.preserveDrawingBuffer || (mask && m_framebufferBinding)) |
| 813 return false; | 813 return false; |
| 814 | 814 |
| 815 RefPtr<WebGLContextAttributes> contextAttributes = getContextAttributes(); | 815 RefPtr<WebGLContextAttributes> contextAttributes = getContextAttributes(); |
| 816 | 816 |
| 817 // Determine if it's possible to combine the clear the user asked for and th
is clear. | 817 // Determine if it's possible to combine the clear the user asked for and th
is clear. |
| 818 bool combinedClear = mask && !m_scissorEnabled; | 818 bool combinedClear = mask && !m_scissorEnabled; |
| 819 | 819 |
| 820 m_context->disable(GraphicsContext3D::SCISSOR_TEST); | 820 m_context->disable(GL_SCISSOR_TEST); |
| 821 if (combinedClear && (mask & GraphicsContext3D::COLOR_BUFFER_BIT)) | 821 if (combinedClear && (mask & GL_COLOR_BUFFER_BIT)) |
| 822 m_context->clearColor(m_colorMask[0] ? m_clearColor[0] : 0, | 822 m_context->clearColor(m_colorMask[0] ? m_clearColor[0] : 0, |
| 823 m_colorMask[1] ? m_clearColor[1] : 0, | 823 m_colorMask[1] ? m_clearColor[1] : 0, |
| 824 m_colorMask[2] ? m_clearColor[2] : 0, | 824 m_colorMask[2] ? m_clearColor[2] : 0, |
| 825 m_colorMask[3] ? m_clearColor[3] : 0); | 825 m_colorMask[3] ? m_clearColor[3] : 0); |
| 826 else | 826 else |
| 827 m_context->clearColor(0, 0, 0, 0); | 827 m_context->clearColor(0, 0, 0, 0); |
| 828 m_context->colorMask(true, true, true, true); | 828 m_context->colorMask(true, true, true, true); |
| 829 GC3Dbitfield clearMask = GraphicsContext3D::COLOR_BUFFER_BIT; | 829 GC3Dbitfield clearMask = GL_COLOR_BUFFER_BIT; |
| 830 if (contextAttributes->depth()) { | 830 if (contextAttributes->depth()) { |
| 831 if (!combinedClear || !m_depthMask || !(mask & GraphicsContext3D::DEPTH_
BUFFER_BIT)) | 831 if (!combinedClear || !m_depthMask || !(mask & GL_DEPTH_BUFFER_BIT)) |
| 832 m_context->clearDepth(1.0f); | 832 m_context->clearDepth(1.0f); |
| 833 clearMask |= GraphicsContext3D::DEPTH_BUFFER_BIT; | 833 clearMask |= GL_DEPTH_BUFFER_BIT; |
| 834 m_context->depthMask(true); | 834 m_context->depthMask(true); |
| 835 } | 835 } |
| 836 if (contextAttributes->stencil()) { | 836 if (contextAttributes->stencil()) { |
| 837 if (combinedClear && (mask & GraphicsContext3D::STENCIL_BUFFER_BIT)) | 837 if (combinedClear && (mask & GL_STENCIL_BUFFER_BIT)) |
| 838 m_context->clearStencil(m_clearStencil & m_stencilMask); | 838 m_context->clearStencil(m_clearStencil & m_stencilMask); |
| 839 else | 839 else |
| 840 m_context->clearStencil(0); | 840 m_context->clearStencil(0); |
| 841 clearMask |= GraphicsContext3D::STENCIL_BUFFER_BIT; | 841 clearMask |= GL_STENCIL_BUFFER_BIT; |
| 842 m_context->stencilMaskSeparate(GraphicsContext3D::FRONT, 0xFFFFFFFF); | 842 m_context->stencilMaskSeparate(GL_FRONT, 0xFFFFFFFF); |
| 843 } | 843 } |
| 844 | 844 |
| 845 m_drawingBuffer->clearFramebuffers(clearMask); | 845 m_drawingBuffer->clearFramebuffers(clearMask); |
| 846 | 846 |
| 847 restoreStateAfterClear(); | 847 restoreStateAfterClear(); |
| 848 if (m_framebufferBinding) | 848 if (m_framebufferBinding) |
| 849 m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, objectOrZero(
m_framebufferBinding.get())); | 849 m_context->bindFramebuffer(GL_FRAMEBUFFER, objectOrZero(m_framebufferBin
ding.get())); |
| 850 m_layerCleared = true; | 850 m_layerCleared = true; |
| 851 | 851 |
| 852 return combinedClear; | 852 return combinedClear; |
| 853 } | 853 } |
| 854 | 854 |
| 855 void WebGLRenderingContext::restoreStateAfterClear() | 855 void WebGLRenderingContext::restoreStateAfterClear() |
| 856 { | 856 { |
| 857 if (isContextLost()) | 857 if (isContextLost()) |
| 858 return; | 858 return; |
| 859 | 859 |
| 860 // Restore the state that the context set. | 860 // Restore the state that the context set. |
| 861 if (m_scissorEnabled) | 861 if (m_scissorEnabled) |
| 862 m_context->enable(GraphicsContext3D::SCISSOR_TEST); | 862 m_context->enable(GL_SCISSOR_TEST); |
| 863 m_context->clearColor(m_clearColor[0], m_clearColor[1], | 863 m_context->clearColor(m_clearColor[0], m_clearColor[1], |
| 864 m_clearColor[2], m_clearColor[3]); | 864 m_clearColor[2], m_clearColor[3]); |
| 865 m_context->colorMask(m_colorMask[0], m_colorMask[1], | 865 m_context->colorMask(m_colorMask[0], m_colorMask[1], |
| 866 m_colorMask[2], m_colorMask[3]); | 866 m_colorMask[2], m_colorMask[3]); |
| 867 m_context->clearDepth(m_clearDepth); | 867 m_context->clearDepth(m_clearDepth); |
| 868 m_context->clearStencil(m_clearStencil); | 868 m_context->clearStencil(m_clearStencil); |
| 869 m_context->stencilMaskSeparate(GraphicsContext3D::FRONT, m_stencilMask); | 869 m_context->stencilMaskSeparate(GL_FRONT, m_stencilMask); |
| 870 m_context->depthMask(m_depthMask); | 870 m_context->depthMask(m_depthMask); |
| 871 } | 871 } |
| 872 | 872 |
| 873 void WebGLRenderingContext::markLayerComposited() | 873 void WebGLRenderingContext::markLayerComposited() |
| 874 { | 874 { |
| 875 if (!isContextLost()) | 875 if (!isContextLost()) |
| 876 m_context->markLayerComposited(); | 876 m_context->markLayerComposited(); |
| 877 } | 877 } |
| 878 | 878 |
| 879 void WebGLRenderingContext::paintRenderingResultsToCanvas() | 879 void WebGLRenderingContext::paintRenderingResultsToCanvas() |
| (...skipping 20 matching lines...) Expand all Loading... |
| 900 return; | 900 return; |
| 901 | 901 |
| 902 canvas()->clearCopiedImage(); | 902 canvas()->clearCopiedImage(); |
| 903 m_markedCanvasDirty = false; | 903 m_markedCanvasDirty = false; |
| 904 | 904 |
| 905 m_drawingBuffer->commit(); | 905 m_drawingBuffer->commit(); |
| 906 if (!(canvas()->buffer())->copyRenderingResultsFromDrawingBuffer(m_drawingBu
ffer.get())) | 906 if (!(canvas()->buffer())->copyRenderingResultsFromDrawingBuffer(m_drawingBu
ffer.get())) |
| 907 m_context->paintRenderingResultsToCanvas(canvas()->buffer(), m_drawingBu
ffer.get()); | 907 m_context->paintRenderingResultsToCanvas(canvas()->buffer(), m_drawingBu
ffer.get()); |
| 908 | 908 |
| 909 if (m_framebufferBinding) | 909 if (m_framebufferBinding) |
| 910 m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, objectOrZero(
m_framebufferBinding.get())); | 910 m_context->bindFramebuffer(GL_FRAMEBUFFER, objectOrZero(m_framebufferBin
ding.get())); |
| 911 else | 911 else |
| 912 m_drawingBuffer->bind(); | 912 m_drawingBuffer->bind(); |
| 913 } | 913 } |
| 914 | 914 |
| 915 PassRefPtr<ImageData> WebGLRenderingContext::paintRenderingResultsToImageData() | 915 PassRefPtr<ImageData> WebGLRenderingContext::paintRenderingResultsToImageData() |
| 916 { | 916 { |
| 917 if (isContextLost()) | 917 if (isContextLost()) |
| 918 return 0; | 918 return 0; |
| 919 | 919 |
| 920 clearIfComposited(); | 920 clearIfComposited(); |
| 921 m_drawingBuffer->commit(); | 921 m_drawingBuffer->commit(); |
| 922 int width, height; | 922 int width, height; |
| 923 RefPtr<Uint8ClampedArray> imageDataPixels = m_context->paintRenderingResults
ToImageData(m_drawingBuffer.get(), width, height); | 923 RefPtr<Uint8ClampedArray> imageDataPixels = m_context->paintRenderingResults
ToImageData(m_drawingBuffer.get(), width, height); |
| 924 if (!imageDataPixels) | 924 if (!imageDataPixels) |
| 925 return 0; | 925 return 0; |
| 926 | 926 |
| 927 if (m_framebufferBinding) | 927 if (m_framebufferBinding) |
| 928 m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, objectOrZero(
m_framebufferBinding.get())); | 928 m_context->bindFramebuffer(GL_FRAMEBUFFER, objectOrZero(m_framebufferBin
ding.get())); |
| 929 else | 929 else |
| 930 m_drawingBuffer->bind(); | 930 m_drawingBuffer->bind(); |
| 931 | 931 |
| 932 return ImageData::create(IntSize(width, height), imageDataPixels); | 932 return ImageData::create(IntSize(width, height), imageDataPixels); |
| 933 } | 933 } |
| 934 | 934 |
| 935 void WebGLRenderingContext::reshape(int width, int height) | 935 void WebGLRenderingContext::reshape(int width, int height) |
| 936 { | 936 { |
| 937 if (isContextLost()) | 937 if (isContextLost()) |
| 938 return; | 938 return; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 953 if (renderBox && renderBox->hasAcceleratedCompositing()) | 953 if (renderBox && renderBox->hasAcceleratedCompositing()) |
| 954 renderBox->contentChanged(CanvasChanged); | 954 renderBox->contentChanged(CanvasChanged); |
| 955 m_needsUpdate = false; | 955 m_needsUpdate = false; |
| 956 } | 956 } |
| 957 | 957 |
| 958 // We don't have to mark the canvas as dirty, since the newly created image
buffer will also start off | 958 // We don't have to mark the canvas as dirty, since the newly created image
buffer will also start off |
| 959 // clear (and this matches what reshape will do). | 959 // clear (and this matches what reshape will do). |
| 960 m_drawingBuffer->reset(IntSize(width, height)); | 960 m_drawingBuffer->reset(IntSize(width, height)); |
| 961 restoreStateAfterClear(); | 961 restoreStateAfterClear(); |
| 962 | 962 |
| 963 m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, objectOrZero(m_texture
Units[m_activeTextureUnit].m_texture2DBinding.get())); | 963 m_context->bindTexture(GL_TEXTURE_2D, objectOrZero(m_textureUnits[m_activeTe
xtureUnit].m_texture2DBinding.get())); |
| 964 m_context->bindRenderbuffer(GraphicsContext3D::RENDERBUFFER, objectOrZero(m_
renderbufferBinding.get())); | 964 m_context->bindRenderbuffer(GL_RENDERBUFFER, objectOrZero(m_renderbufferBind
ing.get())); |
| 965 if (m_framebufferBinding) | 965 if (m_framebufferBinding) |
| 966 m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, objectOrZero(m_
framebufferBinding.get())); | 966 m_context->bindFramebuffer(GL_FRAMEBUFFER, objectOrZero(m_framebufferBin
ding.get())); |
| 967 } | 967 } |
| 968 | 968 |
| 969 int WebGLRenderingContext::drawingBufferWidth() const | 969 int WebGLRenderingContext::drawingBufferWidth() const |
| 970 { | 970 { |
| 971 return m_drawingBuffer->size().width(); | 971 return m_drawingBuffer->size().width(); |
| 972 } | 972 } |
| 973 | 973 |
| 974 int WebGLRenderingContext::drawingBufferHeight() const | 974 int WebGLRenderingContext::drawingBufferHeight() const |
| 975 { | 975 { |
| 976 return m_drawingBuffer->size().height(); | 976 return m_drawingBuffer->size().height(); |
| 977 } | 977 } |
| 978 | 978 |
| 979 unsigned int WebGLRenderingContext::sizeInBytes(GC3Denum type) | 979 unsigned int WebGLRenderingContext::sizeInBytes(GC3Denum type) |
| 980 { | 980 { |
| 981 switch (type) { | 981 switch (type) { |
| 982 case GraphicsContext3D::BYTE: | 982 case GL_BYTE: |
| 983 return sizeof(GC3Dbyte); | 983 return sizeof(GC3Dbyte); |
| 984 case GraphicsContext3D::UNSIGNED_BYTE: | 984 case GL_UNSIGNED_BYTE: |
| 985 return sizeof(GC3Dubyte); | 985 return sizeof(GC3Dubyte); |
| 986 case GraphicsContext3D::SHORT: | 986 case GL_SHORT: |
| 987 return sizeof(GC3Dshort); | 987 return sizeof(GC3Dshort); |
| 988 case GraphicsContext3D::UNSIGNED_SHORT: | 988 case GL_UNSIGNED_SHORT: |
| 989 return sizeof(GC3Dushort); | 989 return sizeof(GC3Dushort); |
| 990 case GraphicsContext3D::INT: | 990 case GL_INT: |
| 991 return sizeof(GC3Dint); | 991 return sizeof(GC3Dint); |
| 992 case GraphicsContext3D::UNSIGNED_INT: | 992 case GL_UNSIGNED_INT: |
| 993 return sizeof(GC3Duint); | 993 return sizeof(GC3Duint); |
| 994 case GraphicsContext3D::FLOAT: | 994 case GL_FLOAT: |
| 995 return sizeof(GC3Dfloat); | 995 return sizeof(GC3Dfloat); |
| 996 } | 996 } |
| 997 ASSERT_NOT_REACHED(); | 997 ASSERT_NOT_REACHED(); |
| 998 return 0; | 998 return 0; |
| 999 } | 999 } |
| 1000 | 1000 |
| 1001 void WebGLRenderingContext::activeTexture(GC3Denum texture) | 1001 void WebGLRenderingContext::activeTexture(GC3Denum texture) |
| 1002 { | 1002 { |
| 1003 if (isContextLost()) | 1003 if (isContextLost()) |
| 1004 return; | 1004 return; |
| 1005 if (texture - GraphicsContext3D::TEXTURE0 >= m_textureUnits.size()) { | 1005 if (texture - GL_TEXTURE0 >= m_textureUnits.size()) { |
| 1006 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "activeTexture", "tex
ture unit out of range"); | 1006 synthesizeGLError(GL_INVALID_ENUM, "activeTexture", "texture unit out of
range"); |
| 1007 return; | 1007 return; |
| 1008 } | 1008 } |
| 1009 m_activeTextureUnit = texture - GraphicsContext3D::TEXTURE0; | 1009 m_activeTextureUnit = texture - GL_TEXTURE0; |
| 1010 m_context->activeTexture(texture); | 1010 m_context->activeTexture(texture); |
| 1011 | 1011 |
| 1012 m_drawingBuffer->setActiveTextureUnit(texture); | 1012 m_drawingBuffer->setActiveTextureUnit(texture); |
| 1013 | 1013 |
| 1014 } | 1014 } |
| 1015 | 1015 |
| 1016 void WebGLRenderingContext::attachShader(WebGLProgram* program, WebGLShader* sha
der) | 1016 void WebGLRenderingContext::attachShader(WebGLProgram* program, WebGLShader* sha
der) |
| 1017 { | 1017 { |
| 1018 if (isContextLost() || !validateWebGLObject("attachShader", program) || !val
idateWebGLObject("attachShader", shader)) | 1018 if (isContextLost() || !validateWebGLObject("attachShader", program) || !val
idateWebGLObject("attachShader", shader)) |
| 1019 return; | 1019 return; |
| 1020 if (!program->attachShader(shader)) { | 1020 if (!program->attachShader(shader)) { |
| 1021 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "attachShader",
"shader attachment already has shader"); | 1021 synthesizeGLError(GL_INVALID_OPERATION, "attachShader", "shader attachme
nt already has shader"); |
| 1022 return; | 1022 return; |
| 1023 } | 1023 } |
| 1024 m_context->attachShader(objectOrZero(program), objectOrZero(shader)); | 1024 m_context->attachShader(objectOrZero(program), objectOrZero(shader)); |
| 1025 shader->onAttached(); | 1025 shader->onAttached(); |
| 1026 } | 1026 } |
| 1027 | 1027 |
| 1028 void WebGLRenderingContext::bindAttribLocation(WebGLProgram* program, GC3Duint i
ndex, const String& name) | 1028 void WebGLRenderingContext::bindAttribLocation(WebGLProgram* program, GC3Duint i
ndex, const String& name) |
| 1029 { | 1029 { |
| 1030 if (isContextLost() || !validateWebGLObject("bindAttribLocation", program)) | 1030 if (isContextLost() || !validateWebGLObject("bindAttribLocation", program)) |
| 1031 return; | 1031 return; |
| 1032 if (!validateLocationLength("bindAttribLocation", name)) | 1032 if (!validateLocationLength("bindAttribLocation", name)) |
| 1033 return; | 1033 return; |
| 1034 if (!validateString("bindAttribLocation", name)) | 1034 if (!validateString("bindAttribLocation", name)) |
| 1035 return; | 1035 return; |
| 1036 if (isPrefixReserved(name)) { | 1036 if (isPrefixReserved(name)) { |
| 1037 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "bindAttribLocat
ion", "reserved prefix"); | 1037 synthesizeGLError(GL_INVALID_OPERATION, "bindAttribLocation", "reserved
prefix"); |
| 1038 return; | 1038 return; |
| 1039 } | 1039 } |
| 1040 if (index >= m_maxVertexAttribs) { | 1040 if (index >= m_maxVertexAttribs) { |
| 1041 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "bindAttribLocation"
, "index out of range"); | 1041 synthesizeGLError(GL_INVALID_VALUE, "bindAttribLocation", "index out of
range"); |
| 1042 return; | 1042 return; |
| 1043 } | 1043 } |
| 1044 m_context->bindAttribLocation(objectOrZero(program), index, name); | 1044 m_context->bindAttribLocation(objectOrZero(program), index, name); |
| 1045 } | 1045 } |
| 1046 | 1046 |
| 1047 bool WebGLRenderingContext::checkObjectToBeBound(const char* functionName, WebGL
Object* object, bool& deleted) | 1047 bool WebGLRenderingContext::checkObjectToBeBound(const char* functionName, WebGL
Object* object, bool& deleted) |
| 1048 { | 1048 { |
| 1049 deleted = false; | 1049 deleted = false; |
| 1050 if (isContextLost()) | 1050 if (isContextLost()) |
| 1051 return false; | 1051 return false; |
| 1052 if (object) { | 1052 if (object) { |
| 1053 if (!object->validate(contextGroup(), this)) { | 1053 if (!object->validate(contextGroup(), this)) { |
| 1054 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName
, "object not from this context"); | 1054 synthesizeGLError(GL_INVALID_OPERATION, functionName, "object not fr
om this context"); |
| 1055 return false; | 1055 return false; |
| 1056 } | 1056 } |
| 1057 deleted = !object->object(); | 1057 deleted = !object->object(); |
| 1058 } | 1058 } |
| 1059 return true; | 1059 return true; |
| 1060 } | 1060 } |
| 1061 | 1061 |
| 1062 void WebGLRenderingContext::bindBuffer(GC3Denum target, WebGLBuffer* buffer) | 1062 void WebGLRenderingContext::bindBuffer(GC3Denum target, WebGLBuffer* buffer) |
| 1063 { | 1063 { |
| 1064 bool deleted; | 1064 bool deleted; |
| 1065 if (!checkObjectToBeBound("bindBuffer", buffer, deleted)) | 1065 if (!checkObjectToBeBound("bindBuffer", buffer, deleted)) |
| 1066 return; | 1066 return; |
| 1067 if (deleted) | 1067 if (deleted) |
| 1068 buffer = 0; | 1068 buffer = 0; |
| 1069 if (buffer && buffer->getTarget() && buffer->getTarget() != target) { | 1069 if (buffer && buffer->getTarget() && buffer->getTarget() != target) { |
| 1070 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "bindBuffer", "b
uffers can not be used with multiple targets"); | 1070 synthesizeGLError(GL_INVALID_OPERATION, "bindBuffer", "buffers can not b
e used with multiple targets"); |
| 1071 return; | 1071 return; |
| 1072 } | 1072 } |
| 1073 if (target == GraphicsContext3D::ARRAY_BUFFER) | 1073 if (target == GL_ARRAY_BUFFER) |
| 1074 m_boundArrayBuffer = buffer; | 1074 m_boundArrayBuffer = buffer; |
| 1075 else if (target == GraphicsContext3D::ELEMENT_ARRAY_BUFFER) | 1075 else if (target == GL_ELEMENT_ARRAY_BUFFER) |
| 1076 m_boundVertexArrayObject->setElementArrayBuffer(buffer); | 1076 m_boundVertexArrayObject->setElementArrayBuffer(buffer); |
| 1077 else { | 1077 else { |
| 1078 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "bindBuffer", "invali
d target"); | 1078 synthesizeGLError(GL_INVALID_ENUM, "bindBuffer", "invalid target"); |
| 1079 return; | 1079 return; |
| 1080 } | 1080 } |
| 1081 | 1081 |
| 1082 m_context->bindBuffer(target, objectOrZero(buffer)); | 1082 m_context->bindBuffer(target, objectOrZero(buffer)); |
| 1083 if (buffer) | 1083 if (buffer) |
| 1084 buffer->setTarget(target); | 1084 buffer->setTarget(target); |
| 1085 } | 1085 } |
| 1086 | 1086 |
| 1087 void WebGLRenderingContext::bindFramebuffer(GC3Denum target, WebGLFramebuffer* b
uffer) | 1087 void WebGLRenderingContext::bindFramebuffer(GC3Denum target, WebGLFramebuffer* b
uffer) |
| 1088 { | 1088 { |
| 1089 bool deleted; | 1089 bool deleted; |
| 1090 if (!checkObjectToBeBound("bindFramebuffer", buffer, deleted)) | 1090 if (!checkObjectToBeBound("bindFramebuffer", buffer, deleted)) |
| 1091 return; | 1091 return; |
| 1092 if (deleted) | 1092 if (deleted) |
| 1093 buffer = 0; | 1093 buffer = 0; |
| 1094 if (target != GraphicsContext3D::FRAMEBUFFER) { | 1094 if (target != GL_FRAMEBUFFER) { |
| 1095 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "bindFramebuffer", "i
nvalid target"); | 1095 synthesizeGLError(GL_INVALID_ENUM, "bindFramebuffer", "invalid target"); |
| 1096 return; | 1096 return; |
| 1097 } | 1097 } |
| 1098 m_framebufferBinding = buffer; | 1098 m_framebufferBinding = buffer; |
| 1099 m_drawingBuffer->setFramebufferBinding(objectOrZero(m_framebufferBinding.get
())); | 1099 m_drawingBuffer->setFramebufferBinding(objectOrZero(m_framebufferBinding.get
())); |
| 1100 if (!m_framebufferBinding) { | 1100 if (!m_framebufferBinding) { |
| 1101 // Instead of binding fb 0, bind the drawing buffer. | 1101 // Instead of binding fb 0, bind the drawing buffer. |
| 1102 m_drawingBuffer->bind(); | 1102 m_drawingBuffer->bind(); |
| 1103 } else | 1103 } else |
| 1104 m_context->bindFramebuffer(target, objectOrZero(buffer)); | 1104 m_context->bindFramebuffer(target, objectOrZero(buffer)); |
| 1105 if (buffer) | 1105 if (buffer) |
| 1106 buffer->setHasEverBeenBound(); | 1106 buffer->setHasEverBeenBound(); |
| 1107 applyStencilTest(); | 1107 applyStencilTest(); |
| 1108 } | 1108 } |
| 1109 | 1109 |
| 1110 void WebGLRenderingContext::bindRenderbuffer(GC3Denum target, WebGLRenderbuffer*
renderBuffer) | 1110 void WebGLRenderingContext::bindRenderbuffer(GC3Denum target, WebGLRenderbuffer*
renderBuffer) |
| 1111 { | 1111 { |
| 1112 bool deleted; | 1112 bool deleted; |
| 1113 if (!checkObjectToBeBound("bindRenderbuffer", renderBuffer, deleted)) | 1113 if (!checkObjectToBeBound("bindRenderbuffer", renderBuffer, deleted)) |
| 1114 return; | 1114 return; |
| 1115 if (deleted) | 1115 if (deleted) |
| 1116 renderBuffer = 0; | 1116 renderBuffer = 0; |
| 1117 if (target != GraphicsContext3D::RENDERBUFFER) { | 1117 if (target != GL_RENDERBUFFER) { |
| 1118 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "bindRenderbuffer", "
invalid target"); | 1118 synthesizeGLError(GL_INVALID_ENUM, "bindRenderbuffer", "invalid target")
; |
| 1119 return; | 1119 return; |
| 1120 } | 1120 } |
| 1121 m_renderbufferBinding = renderBuffer; | 1121 m_renderbufferBinding = renderBuffer; |
| 1122 m_context->bindRenderbuffer(target, objectOrZero(renderBuffer)); | 1122 m_context->bindRenderbuffer(target, objectOrZero(renderBuffer)); |
| 1123 if (renderBuffer) | 1123 if (renderBuffer) |
| 1124 renderBuffer->setHasEverBeenBound(); | 1124 renderBuffer->setHasEverBeenBound(); |
| 1125 } | 1125 } |
| 1126 | 1126 |
| 1127 void WebGLRenderingContext::bindTexture(GC3Denum target, WebGLTexture* texture) | 1127 void WebGLRenderingContext::bindTexture(GC3Denum target, WebGLTexture* texture) |
| 1128 { | 1128 { |
| 1129 bool deleted; | 1129 bool deleted; |
| 1130 if (!checkObjectToBeBound("bindTexture", texture, deleted)) | 1130 if (!checkObjectToBeBound("bindTexture", texture, deleted)) |
| 1131 return; | 1131 return; |
| 1132 if (deleted) | 1132 if (deleted) |
| 1133 texture = 0; | 1133 texture = 0; |
| 1134 if (texture && texture->getTarget() && texture->getTarget() != target) { | 1134 if (texture && texture->getTarget() && texture->getTarget() != target) { |
| 1135 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "bindTexture", "
textures can not be used with multiple targets"); | 1135 synthesizeGLError(GL_INVALID_OPERATION, "bindTexture", "textures can not
be used with multiple targets"); |
| 1136 return; | 1136 return; |
| 1137 } | 1137 } |
| 1138 GC3Dint maxLevel = 0; | 1138 GC3Dint maxLevel = 0; |
| 1139 if (target == GraphicsContext3D::TEXTURE_2D) { | 1139 if (target == GL_TEXTURE_2D) { |
| 1140 m_textureUnits[m_activeTextureUnit].m_texture2DBinding = texture; | 1140 m_textureUnits[m_activeTextureUnit].m_texture2DBinding = texture; |
| 1141 maxLevel = m_maxTextureLevel; | 1141 maxLevel = m_maxTextureLevel; |
| 1142 | 1142 |
| 1143 if (!m_activeTextureUnit) | 1143 if (!m_activeTextureUnit) |
| 1144 m_drawingBuffer->setTexture2DBinding(objectOrZero(texture)); | 1144 m_drawingBuffer->setTexture2DBinding(objectOrZero(texture)); |
| 1145 | 1145 |
| 1146 } else if (target == GraphicsContext3D::TEXTURE_CUBE_MAP) { | 1146 } else if (target == GL_TEXTURE_CUBE_MAP) { |
| 1147 m_textureUnits[m_activeTextureUnit].m_textureCubeMapBinding = texture; | 1147 m_textureUnits[m_activeTextureUnit].m_textureCubeMapBinding = texture; |
| 1148 maxLevel = m_maxCubeMapTextureLevel; | 1148 maxLevel = m_maxCubeMapTextureLevel; |
| 1149 } else { | 1149 } else { |
| 1150 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "bindTexture", "inval
id target"); | 1150 synthesizeGLError(GL_INVALID_ENUM, "bindTexture", "invalid target"); |
| 1151 return; | 1151 return; |
| 1152 } | 1152 } |
| 1153 | 1153 |
| 1154 m_context->bindTexture(target, objectOrZero(texture)); | 1154 m_context->bindTexture(target, objectOrZero(texture)); |
| 1155 if (texture) { | 1155 if (texture) { |
| 1156 texture->setTarget(target, maxLevel); | 1156 texture->setTarget(target, maxLevel); |
| 1157 m_onePlusMaxNonDefaultTextureUnit = max(m_activeTextureUnit + 1, m_onePl
usMaxNonDefaultTextureUnit); | 1157 m_onePlusMaxNonDefaultTextureUnit = max(m_activeTextureUnit + 1, m_onePl
usMaxNonDefaultTextureUnit); |
| 1158 } else { | 1158 } else { |
| 1159 // If the disabled index is the current maximum, trace backwards to find
the new max enabled texture index | 1159 // If the disabled index is the current maximum, trace backwards to find
the new max enabled texture index |
| 1160 if (m_onePlusMaxNonDefaultTextureUnit == m_activeTextureUnit + 1) { | 1160 if (m_onePlusMaxNonDefaultTextureUnit == m_activeTextureUnit + 1) { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1211 } | 1211 } |
| 1212 | 1212 |
| 1213 void WebGLRenderingContext::bufferData(GC3Denum target, long long size, GC3Denum
usage) | 1213 void WebGLRenderingContext::bufferData(GC3Denum target, long long size, GC3Denum
usage) |
| 1214 { | 1214 { |
| 1215 if (isContextLost()) | 1215 if (isContextLost()) |
| 1216 return; | 1216 return; |
| 1217 WebGLBuffer* buffer = validateBufferDataParameters("bufferData", target, usa
ge); | 1217 WebGLBuffer* buffer = validateBufferDataParameters("bufferData", target, usa
ge); |
| 1218 if (!buffer) | 1218 if (!buffer) |
| 1219 return; | 1219 return; |
| 1220 if (size < 0) { | 1220 if (size < 0) { |
| 1221 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "bufferData", "size
< 0"); | 1221 synthesizeGLError(GL_INVALID_VALUE, "bufferData", "size < 0"); |
| 1222 return; | 1222 return; |
| 1223 } | 1223 } |
| 1224 if (!size) { | 1224 if (!size) { |
| 1225 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "bufferData", "size
== 0"); | 1225 synthesizeGLError(GL_INVALID_VALUE, "bufferData", "size == 0"); |
| 1226 return; | 1226 return; |
| 1227 } | 1227 } |
| 1228 | 1228 |
| 1229 m_context->bufferData(target, static_cast<GC3Dsizeiptr>(size), usage); | 1229 m_context->bufferData(target, static_cast<GC3Dsizeiptr>(size), usage); |
| 1230 } | 1230 } |
| 1231 | 1231 |
| 1232 void WebGLRenderingContext::bufferData(GC3Denum target, ArrayBuffer* data, GC3De
num usage) | 1232 void WebGLRenderingContext::bufferData(GC3Denum target, ArrayBuffer* data, GC3De
num usage) |
| 1233 { | 1233 { |
| 1234 if (isContextLost()) | 1234 if (isContextLost()) |
| 1235 return; | 1235 return; |
| 1236 WebGLBuffer* buffer = validateBufferDataParameters("bufferData", target, usa
ge); | 1236 WebGLBuffer* buffer = validateBufferDataParameters("bufferData", target, usa
ge); |
| 1237 if (!buffer) | 1237 if (!buffer) |
| 1238 return; | 1238 return; |
| 1239 if (!data) { | 1239 if (!data) { |
| 1240 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "bufferData", "no da
ta"); | 1240 synthesizeGLError(GL_INVALID_VALUE, "bufferData", "no data"); |
| 1241 return; | 1241 return; |
| 1242 } | 1242 } |
| 1243 m_context->bufferData(target, data->byteLength(), data->data(), usage); | 1243 m_context->bufferData(target, data->byteLength(), data->data(), usage); |
| 1244 } | 1244 } |
| 1245 | 1245 |
| 1246 void WebGLRenderingContext::bufferData(GC3Denum target, ArrayBufferView* data, G
C3Denum usage) | 1246 void WebGLRenderingContext::bufferData(GC3Denum target, ArrayBufferView* data, G
C3Denum usage) |
| 1247 { | 1247 { |
| 1248 if (isContextLost()) | 1248 if (isContextLost()) |
| 1249 return; | 1249 return; |
| 1250 WebGLBuffer* buffer = validateBufferDataParameters("bufferData", target, usa
ge); | 1250 WebGLBuffer* buffer = validateBufferDataParameters("bufferData", target, usa
ge); |
| 1251 if (!buffer) | 1251 if (!buffer) |
| 1252 return; | 1252 return; |
| 1253 if (!data) { | 1253 if (!data) { |
| 1254 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "bufferData", "no da
ta"); | 1254 synthesizeGLError(GL_INVALID_VALUE, "bufferData", "no data"); |
| 1255 return; | 1255 return; |
| 1256 } | 1256 } |
| 1257 | 1257 |
| 1258 m_context->bufferData(target, data->byteLength(), data->baseAddress(), usage
); | 1258 m_context->bufferData(target, data->byteLength(), data->baseAddress(), usage
); |
| 1259 } | 1259 } |
| 1260 | 1260 |
| 1261 void WebGLRenderingContext::bufferSubData(GC3Denum target, long long offset, Arr
ayBuffer* data) | 1261 void WebGLRenderingContext::bufferSubData(GC3Denum target, long long offset, Arr
ayBuffer* data) |
| 1262 { | 1262 { |
| 1263 if (isContextLost()) | 1263 if (isContextLost()) |
| 1264 return; | 1264 return; |
| 1265 WebGLBuffer* buffer = validateBufferDataParameters("bufferSubData", target,
GraphicsContext3D::STATIC_DRAW); | 1265 WebGLBuffer* buffer = validateBufferDataParameters("bufferSubData", target,
GL_STATIC_DRAW); |
| 1266 if (!buffer) | 1266 if (!buffer) |
| 1267 return; | 1267 return; |
| 1268 if (offset < 0) { | 1268 if (offset < 0) { |
| 1269 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "bufferSubData", "of
fset < 0"); | 1269 synthesizeGLError(GL_INVALID_VALUE, "bufferSubData", "offset < 0"); |
| 1270 return; | 1270 return; |
| 1271 } | 1271 } |
| 1272 if (!data) | 1272 if (!data) |
| 1273 return; | 1273 return; |
| 1274 | 1274 |
| 1275 m_context->bufferSubData(target, static_cast<GC3Dintptr>(offset), data->byte
Length(), data->data()); | 1275 m_context->bufferSubData(target, static_cast<GC3Dintptr>(offset), data->byte
Length(), data->data()); |
| 1276 } | 1276 } |
| 1277 | 1277 |
| 1278 void WebGLRenderingContext::bufferSubData(GC3Denum target, long long offset, Arr
ayBufferView* data) | 1278 void WebGLRenderingContext::bufferSubData(GC3Denum target, long long offset, Arr
ayBufferView* data) |
| 1279 { | 1279 { |
| 1280 if (isContextLost()) | 1280 if (isContextLost()) |
| 1281 return; | 1281 return; |
| 1282 WebGLBuffer* buffer = validateBufferDataParameters("bufferSubData", target,
GraphicsContext3D::STATIC_DRAW); | 1282 WebGLBuffer* buffer = validateBufferDataParameters("bufferSubData", target,
GL_STATIC_DRAW); |
| 1283 if (!buffer) | 1283 if (!buffer) |
| 1284 return; | 1284 return; |
| 1285 if (offset < 0) { | 1285 if (offset < 0) { |
| 1286 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "bufferSubData", "of
fset < 0"); | 1286 synthesizeGLError(GL_INVALID_VALUE, "bufferSubData", "offset < 0"); |
| 1287 return; | 1287 return; |
| 1288 } | 1288 } |
| 1289 if (!data) | 1289 if (!data) |
| 1290 return; | 1290 return; |
| 1291 | 1291 |
| 1292 m_context->bufferSubData(target, static_cast<GC3Dintptr>(offset), data->byte
Length(), data->baseAddress()); | 1292 m_context->bufferSubData(target, static_cast<GC3Dintptr>(offset), data->byte
Length(), data->baseAddress()); |
| 1293 } | 1293 } |
| 1294 | 1294 |
| 1295 GC3Denum WebGLRenderingContext::checkFramebufferStatus(GC3Denum target) | 1295 GC3Denum WebGLRenderingContext::checkFramebufferStatus(GC3Denum target) |
| 1296 { | 1296 { |
| 1297 if (isContextLost()) | 1297 if (isContextLost()) |
| 1298 return GraphicsContext3D::FRAMEBUFFER_UNSUPPORTED; | 1298 return GL_FRAMEBUFFER_UNSUPPORTED; |
| 1299 if (target != GraphicsContext3D::FRAMEBUFFER) { | 1299 if (target != GL_FRAMEBUFFER) { |
| 1300 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "checkFramebufferStat
us", "invalid target"); | 1300 synthesizeGLError(GL_INVALID_ENUM, "checkFramebufferStatus", "invalid ta
rget"); |
| 1301 return 0; | 1301 return 0; |
| 1302 } | 1302 } |
| 1303 if (!m_framebufferBinding || !m_framebufferBinding->object()) | 1303 if (!m_framebufferBinding || !m_framebufferBinding->object()) |
| 1304 return GraphicsContext3D::FRAMEBUFFER_COMPLETE; | 1304 return GL_FRAMEBUFFER_COMPLETE; |
| 1305 const char* reason = "framebuffer incomplete"; | 1305 const char* reason = "framebuffer incomplete"; |
| 1306 GC3Denum result = m_framebufferBinding->checkStatus(&reason); | 1306 GC3Denum result = m_framebufferBinding->checkStatus(&reason); |
| 1307 if (result != GraphicsContext3D::FRAMEBUFFER_COMPLETE) { | 1307 if (result != GL_FRAMEBUFFER_COMPLETE) { |
| 1308 emitGLWarning("checkFramebufferStatus", reason); | 1308 emitGLWarning("checkFramebufferStatus", reason); |
| 1309 return result; | 1309 return result; |
| 1310 } | 1310 } |
| 1311 result = m_context->checkFramebufferStatus(target); | 1311 result = m_context->checkFramebufferStatus(target); |
| 1312 return result; | 1312 return result; |
| 1313 } | 1313 } |
| 1314 | 1314 |
| 1315 void WebGLRenderingContext::clear(GC3Dbitfield mask) | 1315 void WebGLRenderingContext::clear(GC3Dbitfield mask) |
| 1316 { | 1316 { |
| 1317 if (isContextLost()) | 1317 if (isContextLost()) |
| 1318 return; | 1318 return; |
| 1319 if (mask & ~(GraphicsContext3D::COLOR_BUFFER_BIT | GraphicsContext3D::DEPTH_
BUFFER_BIT | GraphicsContext3D::STENCIL_BUFFER_BIT)) { | 1319 if (mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_B
IT)) { |
| 1320 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "clear", "invalid ma
sk"); | 1320 synthesizeGLError(GL_INVALID_VALUE, "clear", "invalid mask"); |
| 1321 return; | 1321 return; |
| 1322 } | 1322 } |
| 1323 const char* reason = "framebuffer incomplete"; | 1323 const char* reason = "framebuffer incomplete"; |
| 1324 if (m_framebufferBinding && !m_framebufferBinding->onAccess(graphicsContext3
D(), &reason)) { | 1324 if (m_framebufferBinding && !m_framebufferBinding->onAccess(graphicsContext3
D(), &reason)) { |
| 1325 synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, "cle
ar", reason); | 1325 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "clear", reason); |
| 1326 return; | 1326 return; |
| 1327 } | 1327 } |
| 1328 if (!clearIfComposited(mask)) | 1328 if (!clearIfComposited(mask)) |
| 1329 m_context->clear(mask); | 1329 m_context->clear(mask); |
| 1330 markContextChanged(); | 1330 markContextChanged(); |
| 1331 } | 1331 } |
| 1332 | 1332 |
| 1333 void WebGLRenderingContext::clearColor(GC3Dfloat r, GC3Dfloat g, GC3Dfloat b, GC
3Dfloat a) | 1333 void WebGLRenderingContext::clearColor(GC3Dfloat r, GC3Dfloat g, GC3Dfloat b, GC
3Dfloat a) |
| 1334 { | 1334 { |
| 1335 if (isContextLost()) | 1335 if (isContextLost()) |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1385 | 1385 |
| 1386 void WebGLRenderingContext::compressedTexImage2D(GC3Denum target, GC3Dint level,
GC3Denum internalformat, GC3Dsizei width, | 1386 void WebGLRenderingContext::compressedTexImage2D(GC3Denum target, GC3Dint level,
GC3Denum internalformat, GC3Dsizei width, |
| 1387 GC3Dsizei height, GC3Dint borde
r, ArrayBufferView* data) | 1387 GC3Dsizei height, GC3Dint borde
r, ArrayBufferView* data) |
| 1388 { | 1388 { |
| 1389 if (isContextLost()) | 1389 if (isContextLost()) |
| 1390 return; | 1390 return; |
| 1391 if (!validateTexFuncLevel("compressedTexImage2D", target, level)) | 1391 if (!validateTexFuncLevel("compressedTexImage2D", target, level)) |
| 1392 return; | 1392 return; |
| 1393 | 1393 |
| 1394 if (!validateCompressedTexFormat(internalformat)) { | 1394 if (!validateCompressedTexFormat(internalformat)) { |
| 1395 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "compressedTexImage2D
", "invalid internalformat"); | 1395 synthesizeGLError(GL_INVALID_ENUM, "compressedTexImage2D", "invalid inte
rnalformat"); |
| 1396 return; | 1396 return; |
| 1397 } | 1397 } |
| 1398 if (border) { | 1398 if (border) { |
| 1399 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "compressedTexImage2
D", "border not 0"); | 1399 synthesizeGLError(GL_INVALID_VALUE, "compressedTexImage2D", "border not
0"); |
| 1400 return; | 1400 return; |
| 1401 } | 1401 } |
| 1402 if (!validateCompressedTexDimensions("compressedTexImage2D", NotTexSubImage2
D, target, level, width, height, internalformat)) | 1402 if (!validateCompressedTexDimensions("compressedTexImage2D", NotTexSubImage2
D, target, level, width, height, internalformat)) |
| 1403 return; | 1403 return; |
| 1404 if (!validateCompressedTexFuncData("compressedTexImage2D", width, height, in
ternalformat, data)) | 1404 if (!validateCompressedTexFuncData("compressedTexImage2D", width, height, in
ternalformat, data)) |
| 1405 return; | 1405 return; |
| 1406 | 1406 |
| 1407 WebGLTexture* tex = validateTextureBinding("compressedTexImage2D", target, t
rue); | 1407 WebGLTexture* tex = validateTextureBinding("compressedTexImage2D", target, t
rue); |
| 1408 if (!tex) | 1408 if (!tex) |
| 1409 return; | 1409 return; |
| 1410 if (!isGLES2NPOTStrict()) { | 1410 if (!isGLES2NPOTStrict()) { |
| 1411 if (level && WebGLTexture::isNPOT(width, height)) { | 1411 if (level && WebGLTexture::isNPOT(width, height)) { |
| 1412 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "compressedTexIm
age2D", "level > 0 not power of 2"); | 1412 synthesizeGLError(GL_INVALID_VALUE, "compressedTexImage2D", "level >
0 not power of 2"); |
| 1413 return; | 1413 return; |
| 1414 } | 1414 } |
| 1415 } | 1415 } |
| 1416 graphicsContext3D()->compressedTexImage2D(target, level, internalformat, wid
th, height, | 1416 graphicsContext3D()->compressedTexImage2D(target, level, internalformat, wid
th, height, |
| 1417 border, data->byteLength(), data->
baseAddress()); | 1417 border, data->byteLength(), data->
baseAddress()); |
| 1418 tex->setLevelInfo(target, level, internalformat, width, height, GraphicsCont
ext3D::UNSIGNED_BYTE); | 1418 tex->setLevelInfo(target, level, internalformat, width, height, GL_UNSIGNED_
BYTE); |
| 1419 } | 1419 } |
| 1420 | 1420 |
| 1421 void WebGLRenderingContext::compressedTexSubImage2D(GC3Denum target, GC3Dint lev
el, GC3Dint xoffset, GC3Dint yoffset, | 1421 void WebGLRenderingContext::compressedTexSubImage2D(GC3Denum target, GC3Dint lev
el, GC3Dint xoffset, GC3Dint yoffset, |
| 1422 GC3Dsizei width, GC3Dsizei h
eight, GC3Denum format, ArrayBufferView* data) | 1422 GC3Dsizei width, GC3Dsizei h
eight, GC3Denum format, ArrayBufferView* data) |
| 1423 { | 1423 { |
| 1424 if (isContextLost()) | 1424 if (isContextLost()) |
| 1425 return; | 1425 return; |
| 1426 if (!validateTexFuncLevel("compressedTexSubImage2D", target, level)) | 1426 if (!validateTexFuncLevel("compressedTexSubImage2D", target, level)) |
| 1427 return; | 1427 return; |
| 1428 if (!validateCompressedTexFormat(format)) { | 1428 if (!validateCompressedTexFormat(format)) { |
| 1429 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "compressedTexSubImag
e2D", "invalid format"); | 1429 synthesizeGLError(GL_INVALID_ENUM, "compressedTexSubImage2D", "invalid f
ormat"); |
| 1430 return; | 1430 return; |
| 1431 } | 1431 } |
| 1432 if (!validateCompressedTexFuncData("compressedTexSubImage2D", width, height,
format, data)) | 1432 if (!validateCompressedTexFuncData("compressedTexSubImage2D", width, height,
format, data)) |
| 1433 return; | 1433 return; |
| 1434 | 1434 |
| 1435 WebGLTexture* tex = validateTextureBinding("compressedTexSubImage2D", target
, true); | 1435 WebGLTexture* tex = validateTextureBinding("compressedTexSubImage2D", target
, true); |
| 1436 if (!tex) | 1436 if (!tex) |
| 1437 return; | 1437 return; |
| 1438 | 1438 |
| 1439 if (format != tex->getInternalFormat(target, level)) { | 1439 if (format != tex->getInternalFormat(target, level)) { |
| 1440 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "compressedTexSu
bImage2D", "format does not match texture format"); | 1440 synthesizeGLError(GL_INVALID_OPERATION, "compressedTexSubImage2D", "form
at does not match texture format"); |
| 1441 return; | 1441 return; |
| 1442 } | 1442 } |
| 1443 | 1443 |
| 1444 if (!validateCompressedTexSubDimensions("compressedTexSubImage2D", target, l
evel, xoffset, yoffset, width, height, format, tex)) | 1444 if (!validateCompressedTexSubDimensions("compressedTexSubImage2D", target, l
evel, xoffset, yoffset, width, height, format, tex)) |
| 1445 return; | 1445 return; |
| 1446 | 1446 |
| 1447 graphicsContext3D()->compressedTexSubImage2D(target, level, xoffset, yoffset
, | 1447 graphicsContext3D()->compressedTexSubImage2D(target, level, xoffset, yoffset
, |
| 1448 width, height, format, data->by
teLength(), data->baseAddress()); | 1448 width, height, format, data->by
teLength(), data->baseAddress()); |
| 1449 } | 1449 } |
| 1450 | 1450 |
| 1451 bool WebGLRenderingContext::validateSettableTexFormat(const char* functionName,
GC3Denum format) | 1451 bool WebGLRenderingContext::validateSettableTexFormat(const char* functionName,
GC3Denum format) |
| 1452 { | 1452 { |
| 1453 if (GraphicsContext3D::getClearBitsByFormat(format) & (GraphicsContext3D::DE
PTH_BUFFER_BIT | GraphicsContext3D::STENCIL_BUFFER_BIT)) { | 1453 if (GraphicsContext3D::getClearBitsByFormat(format) & (GL_DEPTH_BUFFER_BIT |
GL_STENCIL_BUFFER_BIT)) { |
| 1454 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, "f
ormat can not be set, only rendered to"); | 1454 synthesizeGLError(GL_INVALID_OPERATION, functionName, "format can not be
set, only rendered to"); |
| 1455 return false; | 1455 return false; |
| 1456 } | 1456 } |
| 1457 return true; | 1457 return true; |
| 1458 } | 1458 } |
| 1459 | 1459 |
| 1460 void WebGLRenderingContext::copyTexImage2D(GC3Denum target, GC3Dint level, GC3De
num internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3
Dint border) | 1460 void WebGLRenderingContext::copyTexImage2D(GC3Denum target, GC3Dint level, GC3De
num internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3
Dint border) |
| 1461 { | 1461 { |
| 1462 if (isContextLost()) | 1462 if (isContextLost()) |
| 1463 return; | 1463 return; |
| 1464 if (!validateTexFuncParameters("copyTexImage2D", NotTexSubImage2D, target, l
evel, internalformat, width, height, border, internalformat, GraphicsContext3D::
UNSIGNED_BYTE)) | 1464 if (!validateTexFuncParameters("copyTexImage2D", NotTexSubImage2D, target, l
evel, internalformat, width, height, border, internalformat, GL_UNSIGNED_BYTE)) |
| 1465 return; | 1465 return; |
| 1466 if (!validateSettableTexFormat("copyTexImage2D", internalformat)) | 1466 if (!validateSettableTexFormat("copyTexImage2D", internalformat)) |
| 1467 return; | 1467 return; |
| 1468 WebGLTexture* tex = validateTextureBinding("copyTexImage2D", target, true); | 1468 WebGLTexture* tex = validateTextureBinding("copyTexImage2D", target, true); |
| 1469 if (!tex) | 1469 if (!tex) |
| 1470 return; | 1470 return; |
| 1471 if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFra
mebufferColorFormat())) { | 1471 if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFra
mebufferColorFormat())) { |
| 1472 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "copyTexImage2D"
, "framebuffer is incompatible format"); | 1472 synthesizeGLError(GL_INVALID_OPERATION, "copyTexImage2D", "framebuffer i
s incompatible format"); |
| 1473 return; | 1473 return; |
| 1474 } | 1474 } |
| 1475 if (!isGLES2NPOTStrict() && level && WebGLTexture::isNPOT(width, height)) { | 1475 if (!isGLES2NPOTStrict() && level && WebGLTexture::isNPOT(width, height)) { |
| 1476 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "copyTexImage2D", "l
evel > 0 not power of 2"); | 1476 synthesizeGLError(GL_INVALID_VALUE, "copyTexImage2D", "level > 0 not pow
er of 2"); |
| 1477 return; | 1477 return; |
| 1478 } | 1478 } |
| 1479 const char* reason = "framebuffer incomplete"; | 1479 const char* reason = "framebuffer incomplete"; |
| 1480 if (m_framebufferBinding && !m_framebufferBinding->onAccess(graphicsContext3
D(), &reason)) { | 1480 if (m_framebufferBinding && !m_framebufferBinding->onAccess(graphicsContext3
D(), &reason)) { |
| 1481 synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, "cop
yTexImage2D", reason); | 1481 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "copyTexImage2D", re
ason); |
| 1482 return; | 1482 return; |
| 1483 } | 1483 } |
| 1484 clearIfComposited(); | 1484 clearIfComposited(); |
| 1485 ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding
.get()); | 1485 ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding
.get()); |
| 1486 m_context->copyTexImage2D(target, level, internalformat, x, y, width, height
, border); | 1486 m_context->copyTexImage2D(target, level, internalformat, x, y, width, height
, border); |
| 1487 // FIXME: if the framebuffer is not complete, none of the below should be ex
ecuted. | 1487 // FIXME: if the framebuffer is not complete, none of the below should be ex
ecuted. |
| 1488 tex->setLevelInfo(target, level, internalformat, width, height, GraphicsCont
ext3D::UNSIGNED_BYTE); | 1488 tex->setLevelInfo(target, level, internalformat, width, height, GL_UNSIGNED_
BYTE); |
| 1489 } | 1489 } |
| 1490 | 1490 |
| 1491 void WebGLRenderingContext::copyTexSubImage2D(GC3Denum target, GC3Dint level, GC
3Dint xoffset, GC3Dint yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei
height) | 1491 void WebGLRenderingContext::copyTexSubImage2D(GC3Denum target, GC3Dint level, GC
3Dint xoffset, GC3Dint yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei
height) |
| 1492 { | 1492 { |
| 1493 if (isContextLost()) | 1493 if (isContextLost()) |
| 1494 return; | 1494 return; |
| 1495 if (!validateTexFuncLevel("copyTexSubImage2D", target, level)) | 1495 if (!validateTexFuncLevel("copyTexSubImage2D", target, level)) |
| 1496 return; | 1496 return; |
| 1497 WebGLTexture* tex = validateTextureBinding("copyTexSubImage2D", target, true
); | 1497 WebGLTexture* tex = validateTextureBinding("copyTexSubImage2D", target, true
); |
| 1498 if (!tex) | 1498 if (!tex) |
| 1499 return; | 1499 return; |
| 1500 if (!validateSize("copyTexSubImage2D", xoffset, yoffset) || !validateSize("c
opyTexSubImage2D", width, height)) | 1500 if (!validateSize("copyTexSubImage2D", xoffset, yoffset) || !validateSize("c
opyTexSubImage2D", width, height)) |
| 1501 return; | 1501 return; |
| 1502 // Before checking if it is in the range, check if overflow happens first. | 1502 // Before checking if it is in the range, check if overflow happens first. |
| 1503 if (xoffset + width < 0 || yoffset + height < 0) { | 1503 if (xoffset + width < 0 || yoffset + height < 0) { |
| 1504 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "copyTexSubImage2D",
"bad dimensions"); | 1504 synthesizeGLError(GL_INVALID_VALUE, "copyTexSubImage2D", "bad dimensions
"); |
| 1505 return; | 1505 return; |
| 1506 } | 1506 } |
| 1507 if (xoffset + width > tex->getWidth(target, level) || yoffset + height > tex
->getHeight(target, level)) { | 1507 if (xoffset + width > tex->getWidth(target, level) || yoffset + height > tex
->getHeight(target, level)) { |
| 1508 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "copyTexSubImage2D",
"rectangle out of range"); | 1508 synthesizeGLError(GL_INVALID_VALUE, "copyTexSubImage2D", "rectangle out
of range"); |
| 1509 return; | 1509 return; |
| 1510 } | 1510 } |
| 1511 GC3Denum internalformat = tex->getInternalFormat(target, level); | 1511 GC3Denum internalformat = tex->getInternalFormat(target, level); |
| 1512 if (!validateSettableTexFormat("copyTexSubImage2D", internalformat)) | 1512 if (!validateSettableTexFormat("copyTexSubImage2D", internalformat)) |
| 1513 return; | 1513 return; |
| 1514 if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFra
mebufferColorFormat())) { | 1514 if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFra
mebufferColorFormat())) { |
| 1515 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "copyTexSubImage
2D", "framebuffer is incompatible format"); | 1515 synthesizeGLError(GL_INVALID_OPERATION, "copyTexSubImage2D", "framebuffe
r is incompatible format"); |
| 1516 return; | 1516 return; |
| 1517 } | 1517 } |
| 1518 const char* reason = "framebuffer incomplete"; | 1518 const char* reason = "framebuffer incomplete"; |
| 1519 if (m_framebufferBinding && !m_framebufferBinding->onAccess(graphicsContext3
D(), &reason)) { | 1519 if (m_framebufferBinding && !m_framebufferBinding->onAccess(graphicsContext3
D(), &reason)) { |
| 1520 synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, "cop
yTexSubImage2D", reason); | 1520 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "copyTexSubImage2D",
reason); |
| 1521 return; | 1521 return; |
| 1522 } | 1522 } |
| 1523 clearIfComposited(); | 1523 clearIfComposited(); |
| 1524 ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding
.get()); | 1524 ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding
.get()); |
| 1525 m_context->copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, h
eight); | 1525 m_context->copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, h
eight); |
| 1526 } | 1526 } |
| 1527 | 1527 |
| 1528 PassRefPtr<WebGLBuffer> WebGLRenderingContext::createBuffer() | 1528 PassRefPtr<WebGLBuffer> WebGLRenderingContext::createBuffer() |
| 1529 { | 1529 { |
| 1530 if (isContextLost()) | 1530 if (isContextLost()) |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1579 m_context->bindRenderbuffer(target, objectOrZero(renderbuffer->emulatedS
tencilBuffer())); | 1579 m_context->bindRenderbuffer(target, objectOrZero(renderbuffer->emulatedS
tencilBuffer())); |
| 1580 m_context->bindRenderbuffer(target, objectOrZero(m_renderbufferBinding.g
et())); | 1580 m_context->bindRenderbuffer(target, objectOrZero(m_renderbufferBinding.g
et())); |
| 1581 } | 1581 } |
| 1582 return renderbuffer->emulatedStencilBuffer(); | 1582 return renderbuffer->emulatedStencilBuffer(); |
| 1583 } | 1583 } |
| 1584 | 1584 |
| 1585 PassRefPtr<WebGLShader> WebGLRenderingContext::createShader(GC3Denum type) | 1585 PassRefPtr<WebGLShader> WebGLRenderingContext::createShader(GC3Denum type) |
| 1586 { | 1586 { |
| 1587 if (isContextLost()) | 1587 if (isContextLost()) |
| 1588 return 0; | 1588 return 0; |
| 1589 if (type != GraphicsContext3D::VERTEX_SHADER && type != GraphicsContext3D::F
RAGMENT_SHADER) { | 1589 if (type != GL_VERTEX_SHADER && type != GL_FRAGMENT_SHADER) { |
| 1590 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "createShader", "inva
lid shader type"); | 1590 synthesizeGLError(GL_INVALID_ENUM, "createShader", "invalid shader type"
); |
| 1591 return 0; | 1591 return 0; |
| 1592 } | 1592 } |
| 1593 | 1593 |
| 1594 RefPtr<WebGLShader> o = WebGLShader::create(this, type); | 1594 RefPtr<WebGLShader> o = WebGLShader::create(this, type); |
| 1595 addSharedObject(o.get()); | 1595 addSharedObject(o.get()); |
| 1596 return o; | 1596 return o; |
| 1597 } | 1597 } |
| 1598 | 1598 |
| 1599 void WebGLRenderingContext::cullFace(GC3Denum mode) | 1599 void WebGLRenderingContext::cullFace(GC3Denum mode) |
| 1600 { | 1600 { |
| 1601 if (isContextLost()) | 1601 if (isContextLost()) |
| 1602 return; | 1602 return; |
| 1603 switch (mode) { | 1603 switch (mode) { |
| 1604 case GraphicsContext3D::FRONT_AND_BACK: | 1604 case GL_FRONT_AND_BACK: |
| 1605 case GraphicsContext3D::FRONT: | 1605 case GL_FRONT: |
| 1606 case GraphicsContext3D::BACK: | 1606 case GL_BACK: |
| 1607 break; | 1607 break; |
| 1608 default: | 1608 default: |
| 1609 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "cullFace", "invalid
mode"); | 1609 synthesizeGLError(GL_INVALID_ENUM, "cullFace", "invalid mode"); |
| 1610 return; | 1610 return; |
| 1611 } | 1611 } |
| 1612 m_context->cullFace(mode); | 1612 m_context->cullFace(mode); |
| 1613 } | 1613 } |
| 1614 | 1614 |
| 1615 bool WebGLRenderingContext::deleteObject(WebGLObject* object) | 1615 bool WebGLRenderingContext::deleteObject(WebGLObject* object) |
| 1616 { | 1616 { |
| 1617 if (isContextLost() || !object) | 1617 if (isContextLost() || !object) |
| 1618 return false; | 1618 return false; |
| 1619 if (!object->validate(contextGroup(), this)) { | 1619 if (!object->validate(contextGroup(), this)) { |
| 1620 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "delete", "objec
t does not belong to this context"); | 1620 synthesizeGLError(GL_INVALID_OPERATION, "delete", "object does not belon
g to this context"); |
| 1621 return false; | 1621 return false; |
| 1622 } | 1622 } |
| 1623 if (object->object()) | 1623 if (object->object()) |
| 1624 // We need to pass in context here because we want | 1624 // We need to pass in context here because we want |
| 1625 // things in this context unbound. | 1625 // things in this context unbound. |
| 1626 object->deleteObject(graphicsContext3D()); | 1626 object->deleteObject(graphicsContext3D()); |
| 1627 return true; | 1627 return true; |
| 1628 } | 1628 } |
| 1629 | 1629 |
| 1630 void WebGLRenderingContext::deleteBuffer(WebGLBuffer* buffer) | 1630 void WebGLRenderingContext::deleteBuffer(WebGLBuffer* buffer) |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1713 return; | 1713 return; |
| 1714 m_depthMask = flag; | 1714 m_depthMask = flag; |
| 1715 m_context->depthMask(flag); | 1715 m_context->depthMask(flag); |
| 1716 } | 1716 } |
| 1717 | 1717 |
| 1718 void WebGLRenderingContext::depthRange(GC3Dfloat zNear, GC3Dfloat zFar) | 1718 void WebGLRenderingContext::depthRange(GC3Dfloat zNear, GC3Dfloat zFar) |
| 1719 { | 1719 { |
| 1720 if (isContextLost()) | 1720 if (isContextLost()) |
| 1721 return; | 1721 return; |
| 1722 if (zNear > zFar) { | 1722 if (zNear > zFar) { |
| 1723 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "depthRange", "z
Near > zFar"); | 1723 synthesizeGLError(GL_INVALID_OPERATION, "depthRange", "zNear > zFar"); |
| 1724 return; | 1724 return; |
| 1725 } | 1725 } |
| 1726 m_context->depthRange(zNear, zFar); | 1726 m_context->depthRange(zNear, zFar); |
| 1727 } | 1727 } |
| 1728 | 1728 |
| 1729 void WebGLRenderingContext::detachShader(WebGLProgram* program, WebGLShader* sha
der) | 1729 void WebGLRenderingContext::detachShader(WebGLProgram* program, WebGLShader* sha
der) |
| 1730 { | 1730 { |
| 1731 if (isContextLost() || !validateWebGLObject("detachShader", program) || !val
idateWebGLObject("detachShader", shader)) | 1731 if (isContextLost() || !validateWebGLObject("detachShader", program) || !val
idateWebGLObject("detachShader", shader)) |
| 1732 return; | 1732 return; |
| 1733 if (!program->detachShader(shader)) { | 1733 if (!program->detachShader(shader)) { |
| 1734 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "detachShader",
"shader not attached"); | 1734 synthesizeGLError(GL_INVALID_OPERATION, "detachShader", "shader not atta
ched"); |
| 1735 return; | 1735 return; |
| 1736 } | 1736 } |
| 1737 m_context->detachShader(objectOrZero(program), objectOrZero(shader)); | 1737 m_context->detachShader(objectOrZero(program), objectOrZero(shader)); |
| 1738 shader->onDetached(graphicsContext3D()); | 1738 shader->onDetached(graphicsContext3D()); |
| 1739 } | 1739 } |
| 1740 | 1740 |
| 1741 void WebGLRenderingContext::disable(GC3Denum cap) | 1741 void WebGLRenderingContext::disable(GC3Denum cap) |
| 1742 { | 1742 { |
| 1743 if (isContextLost() || !validateCapability("disable", cap)) | 1743 if (isContextLost() || !validateCapability("disable", cap)) |
| 1744 return; | 1744 return; |
| 1745 if (cap == GraphicsContext3D::STENCIL_TEST) { | 1745 if (cap == GL_STENCIL_TEST) { |
| 1746 m_stencilEnabled = false; | 1746 m_stencilEnabled = false; |
| 1747 applyStencilTest(); | 1747 applyStencilTest(); |
| 1748 return; | 1748 return; |
| 1749 } | 1749 } |
| 1750 if (cap == GraphicsContext3D::SCISSOR_TEST) { | 1750 if (cap == GL_SCISSOR_TEST) { |
| 1751 m_scissorEnabled = false; | 1751 m_scissorEnabled = false; |
| 1752 m_drawingBuffer->setScissorEnabled(m_scissorEnabled); | 1752 m_drawingBuffer->setScissorEnabled(m_scissorEnabled); |
| 1753 } | 1753 } |
| 1754 m_context->disable(cap); | 1754 m_context->disable(cap); |
| 1755 } | 1755 } |
| 1756 | 1756 |
| 1757 void WebGLRenderingContext::disableVertexAttribArray(GC3Duint index) | 1757 void WebGLRenderingContext::disableVertexAttribArray(GC3Duint index) |
| 1758 { | 1758 { |
| 1759 if (isContextLost()) | 1759 if (isContextLost()) |
| 1760 return; | 1760 return; |
| 1761 if (index >= m_maxVertexAttribs) { | 1761 if (index >= m_maxVertexAttribs) { |
| 1762 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "disableVertexAttrib
Array", "index out of range"); | 1762 synthesizeGLError(GL_INVALID_VALUE, "disableVertexAttribArray", "index o
ut of range"); |
| 1763 return; | 1763 return; |
| 1764 } | 1764 } |
| 1765 | 1765 |
| 1766 WebGLVertexArrayObjectOES::VertexAttribState& state = m_boundVertexArrayObje
ct->getVertexAttribState(index); | 1766 WebGLVertexArrayObjectOES::VertexAttribState& state = m_boundVertexArrayObje
ct->getVertexAttribState(index); |
| 1767 state.enabled = false; | 1767 state.enabled = false; |
| 1768 | 1768 |
| 1769 // If the disabled index is the current maximum, trace backwards to find the
new max enabled attrib index | 1769 // If the disabled index is the current maximum, trace backwards to find the
new max enabled attrib index |
| 1770 if (m_onePlusMaxEnabledAttribIndex == index + 1) { | 1770 if (m_onePlusMaxEnabledAttribIndex == index + 1) { |
| 1771 findNewMaxEnabledAttribIndex(); | 1771 findNewMaxEnabledAttribIndex(); |
| 1772 } | 1772 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1786 && (!state.bufferBinding || !state.bufferBinding->object())) | 1786 && (!state.bufferBinding || !state.bufferBinding->object())) |
| 1787 return false; | 1787 return false; |
| 1788 } | 1788 } |
| 1789 | 1789 |
| 1790 return true; | 1790 return true; |
| 1791 } | 1791 } |
| 1792 | 1792 |
| 1793 bool WebGLRenderingContext::validateWebGLObject(const char* functionName, WebGLO
bject* object) | 1793 bool WebGLRenderingContext::validateWebGLObject(const char* functionName, WebGLO
bject* object) |
| 1794 { | 1794 { |
| 1795 if (!object || !object->object()) { | 1795 if (!object || !object->object()) { |
| 1796 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "no ob
ject or object deleted"); | 1796 synthesizeGLError(GL_INVALID_VALUE, functionName, "no object or object d
eleted"); |
| 1797 return false; | 1797 return false; |
| 1798 } | 1798 } |
| 1799 if (!object->validate(contextGroup(), this)) { | 1799 if (!object->validate(contextGroup(), this)) { |
| 1800 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, "o
bject does not belong to this context"); | 1800 synthesizeGLError(GL_INVALID_OPERATION, functionName, "object does not b
elong to this context"); |
| 1801 return false; | 1801 return false; |
| 1802 } | 1802 } |
| 1803 return true; | 1803 return true; |
| 1804 } | 1804 } |
| 1805 | 1805 |
| 1806 void WebGLRenderingContext::drawArrays(GC3Denum mode, GC3Dint first, GC3Dsizei c
ount) | 1806 void WebGLRenderingContext::drawArrays(GC3Denum mode, GC3Dint first, GC3Dsizei c
ount) |
| 1807 { | 1807 { |
| 1808 if (!validateDrawArrays("drawArrays", mode, first, count)) | 1808 if (!validateDrawArrays("drawArrays", mode, first, count)) |
| 1809 return; | 1809 return; |
| 1810 | 1810 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1858 handleTextureCompleteness("drawElementsInstancedANGLE", true); | 1858 handleTextureCompleteness("drawElementsInstancedANGLE", true); |
| 1859 m_context->extensions()->drawElementsInstancedANGLE(mode, count, type, stati
c_cast<GC3Dintptr>(offset), primcount); | 1859 m_context->extensions()->drawElementsInstancedANGLE(mode, count, type, stati
c_cast<GC3Dintptr>(offset), primcount); |
| 1860 handleTextureCompleteness("drawElementsInstancedANGLE", false); | 1860 handleTextureCompleteness("drawElementsInstancedANGLE", false); |
| 1861 markContextChanged(); | 1861 markContextChanged(); |
| 1862 } | 1862 } |
| 1863 | 1863 |
| 1864 void WebGLRenderingContext::enable(GC3Denum cap) | 1864 void WebGLRenderingContext::enable(GC3Denum cap) |
| 1865 { | 1865 { |
| 1866 if (isContextLost() || !validateCapability("enable", cap)) | 1866 if (isContextLost() || !validateCapability("enable", cap)) |
| 1867 return; | 1867 return; |
| 1868 if (cap == GraphicsContext3D::STENCIL_TEST) { | 1868 if (cap == GL_STENCIL_TEST) { |
| 1869 m_stencilEnabled = true; | 1869 m_stencilEnabled = true; |
| 1870 applyStencilTest(); | 1870 applyStencilTest(); |
| 1871 return; | 1871 return; |
| 1872 } | 1872 } |
| 1873 if (cap == GraphicsContext3D::SCISSOR_TEST) { | 1873 if (cap == GL_SCISSOR_TEST) { |
| 1874 m_scissorEnabled = true; | 1874 m_scissorEnabled = true; |
| 1875 m_drawingBuffer->setScissorEnabled(m_scissorEnabled); | 1875 m_drawingBuffer->setScissorEnabled(m_scissorEnabled); |
| 1876 } | 1876 } |
| 1877 m_context->enable(cap); | 1877 m_context->enable(cap); |
| 1878 } | 1878 } |
| 1879 | 1879 |
| 1880 void WebGLRenderingContext::enableVertexAttribArray(GC3Duint index) | 1880 void WebGLRenderingContext::enableVertexAttribArray(GC3Duint index) |
| 1881 { | 1881 { |
| 1882 if (isContextLost()) | 1882 if (isContextLost()) |
| 1883 return; | 1883 return; |
| 1884 if (index >= m_maxVertexAttribs) { | 1884 if (index >= m_maxVertexAttribs) { |
| 1885 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "enableVertexAttribA
rray", "index out of range"); | 1885 synthesizeGLError(GL_INVALID_VALUE, "enableVertexAttribArray", "index ou
t of range"); |
| 1886 return; | 1886 return; |
| 1887 } | 1887 } |
| 1888 | 1888 |
| 1889 WebGLVertexArrayObjectOES::VertexAttribState& state = m_boundVertexArrayObje
ct->getVertexAttribState(index); | 1889 WebGLVertexArrayObjectOES::VertexAttribState& state = m_boundVertexArrayObje
ct->getVertexAttribState(index); |
| 1890 state.enabled = true; | 1890 state.enabled = true; |
| 1891 | 1891 |
| 1892 m_onePlusMaxEnabledAttribIndex = max(index + 1, m_onePlusMaxEnabledAttribInd
ex); | 1892 m_onePlusMaxEnabledAttribIndex = max(index + 1, m_onePlusMaxEnabledAttribInd
ex); |
| 1893 | 1893 |
| 1894 m_context->enableVertexAttribArray(index); | 1894 m_context->enableVertexAttribArray(index); |
| 1895 } | 1895 } |
| 1896 | 1896 |
| 1897 void WebGLRenderingContext::finish() | 1897 void WebGLRenderingContext::finish() |
| 1898 { | 1898 { |
| 1899 if (isContextLost()) | 1899 if (isContextLost()) |
| 1900 return; | 1900 return; |
| 1901 m_context->flush(); // Intentionally a flush, not a finish. | 1901 m_context->flush(); // Intentionally a flush, not a finish. |
| 1902 } | 1902 } |
| 1903 | 1903 |
| 1904 void WebGLRenderingContext::flush() | 1904 void WebGLRenderingContext::flush() |
| 1905 { | 1905 { |
| 1906 if (isContextLost()) | 1906 if (isContextLost()) |
| 1907 return; | 1907 return; |
| 1908 m_context->flush(); | 1908 m_context->flush(); |
| 1909 } | 1909 } |
| 1910 | 1910 |
| 1911 void WebGLRenderingContext::framebufferRenderbuffer(GC3Denum target, GC3Denum at
tachment, GC3Denum renderbuffertarget, WebGLRenderbuffer* buffer) | 1911 void WebGLRenderingContext::framebufferRenderbuffer(GC3Denum target, GC3Denum at
tachment, GC3Denum renderbuffertarget, WebGLRenderbuffer* buffer) |
| 1912 { | 1912 { |
| 1913 if (isContextLost() || !validateFramebufferFuncParameters("framebufferRender
buffer", target, attachment)) | 1913 if (isContextLost() || !validateFramebufferFuncParameters("framebufferRender
buffer", target, attachment)) |
| 1914 return; | 1914 return; |
| 1915 if (renderbuffertarget != GraphicsContext3D::RENDERBUFFER) { | 1915 if (renderbuffertarget != GL_RENDERBUFFER) { |
| 1916 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "framebufferRenderbuf
fer", "invalid target"); | 1916 synthesizeGLError(GL_INVALID_ENUM, "framebufferRenderbuffer", "invalid t
arget"); |
| 1917 return; | 1917 return; |
| 1918 } | 1918 } |
| 1919 if (buffer && !buffer->validate(contextGroup(), this)) { | 1919 if (buffer && !buffer->validate(contextGroup(), this)) { |
| 1920 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "framebufferRend
erbuffer", "no buffer or buffer not from this context"); | 1920 synthesizeGLError(GL_INVALID_OPERATION, "framebufferRenderbuffer", "no b
uffer or buffer not from this context"); |
| 1921 return; | 1921 return; |
| 1922 } | 1922 } |
| 1923 // Don't allow the default framebuffer to be mutated; all current | 1923 // Don't allow the default framebuffer to be mutated; all current |
| 1924 // implementations use an FBO internally in place of the default | 1924 // implementations use an FBO internally in place of the default |
| 1925 // FBO. | 1925 // FBO. |
| 1926 if (!m_framebufferBinding || !m_framebufferBinding->object()) { | 1926 if (!m_framebufferBinding || !m_framebufferBinding->object()) { |
| 1927 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "framebufferRend
erbuffer", "no framebuffer bound"); | 1927 synthesizeGLError(GL_INVALID_OPERATION, "framebufferRenderbuffer", "no f
ramebuffer bound"); |
| 1928 return; | 1928 return; |
| 1929 } | 1929 } |
| 1930 Platform3DObject bufferObject = objectOrZero(buffer); | 1930 Platform3DObject bufferObject = objectOrZero(buffer); |
| 1931 switch (attachment) { | 1931 switch (attachment) { |
| 1932 case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT: | 1932 case GC3D_DEPTH_STENCIL_ATTACHMENT: |
| 1933 if (isDepthStencilSupported() || !buffer) { | 1933 if (isDepthStencilSupported() || !buffer) { |
| 1934 m_context->framebufferRenderbuffer(target, GraphicsContext3D::DEPTH_
ATTACHMENT, renderbuffertarget, bufferObject); | 1934 m_context->framebufferRenderbuffer(target, GL_DEPTH_ATTACHMENT, rend
erbuffertarget, bufferObject); |
| 1935 m_context->framebufferRenderbuffer(target, GraphicsContext3D::STENCI
L_ATTACHMENT, renderbuffertarget, bufferObject); | 1935 m_context->framebufferRenderbuffer(target, GL_STENCIL_ATTACHMENT, re
nderbuffertarget, bufferObject); |
| 1936 } else { | 1936 } else { |
| 1937 WebGLRenderbuffer* emulatedStencilBuffer = ensureEmulatedStencilBuff
er(renderbuffertarget, buffer); | 1937 WebGLRenderbuffer* emulatedStencilBuffer = ensureEmulatedStencilBuff
er(renderbuffertarget, buffer); |
| 1938 if (!emulatedStencilBuffer) { | 1938 if (!emulatedStencilBuffer) { |
| 1939 synthesizeGLError(GraphicsContext3D::OUT_OF_MEMORY, "framebuffer
Renderbuffer", "out of memory"); | 1939 synthesizeGLError(GL_OUT_OF_MEMORY, "framebufferRenderbuffer", "
out of memory"); |
| 1940 return; | 1940 return; |
| 1941 } | 1941 } |
| 1942 m_context->framebufferRenderbuffer(target, GraphicsContext3D::DEPTH_
ATTACHMENT, renderbuffertarget, bufferObject); | 1942 m_context->framebufferRenderbuffer(target, GL_DEPTH_ATTACHMENT, rend
erbuffertarget, bufferObject); |
| 1943 m_context->framebufferRenderbuffer(target, GraphicsContext3D::STENCI
L_ATTACHMENT, renderbuffertarget, objectOrZero(emulatedStencilBuffer)); | 1943 m_context->framebufferRenderbuffer(target, GL_STENCIL_ATTACHMENT, re
nderbuffertarget, objectOrZero(emulatedStencilBuffer)); |
| 1944 } | 1944 } |
| 1945 break; | 1945 break; |
| 1946 default: | 1946 default: |
| 1947 m_context->framebufferRenderbuffer(target, attachment, renderbuffertarge
t, bufferObject); | 1947 m_context->framebufferRenderbuffer(target, attachment, renderbuffertarge
t, bufferObject); |
| 1948 } | 1948 } |
| 1949 m_framebufferBinding->setAttachmentForBoundFramebuffer(attachment, buffer); | 1949 m_framebufferBinding->setAttachmentForBoundFramebuffer(attachment, buffer); |
| 1950 applyStencilTest(); | 1950 applyStencilTest(); |
| 1951 } | 1951 } |
| 1952 | 1952 |
| 1953 void WebGLRenderingContext::framebufferTexture2D(GC3Denum target, GC3Denum attac
hment, GC3Denum textarget, WebGLTexture* texture, GC3Dint level) | 1953 void WebGLRenderingContext::framebufferTexture2D(GC3Denum target, GC3Denum attac
hment, GC3Denum textarget, WebGLTexture* texture, GC3Dint level) |
| 1954 { | 1954 { |
| 1955 if (isContextLost() || !validateFramebufferFuncParameters("framebufferTextur
e2D", target, attachment)) | 1955 if (isContextLost() || !validateFramebufferFuncParameters("framebufferTextur
e2D", target, attachment)) |
| 1956 return; | 1956 return; |
| 1957 if (level) { | 1957 if (level) { |
| 1958 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "framebufferTexture2
D", "level not 0"); | 1958 synthesizeGLError(GL_INVALID_VALUE, "framebufferTexture2D", "level not 0
"); |
| 1959 return; | 1959 return; |
| 1960 } | 1960 } |
| 1961 if (texture && !texture->validate(contextGroup(), this)) { | 1961 if (texture && !texture->validate(contextGroup(), this)) { |
| 1962 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "framebufferText
ure2D", "no texture or texture not from this context"); | 1962 synthesizeGLError(GL_INVALID_OPERATION, "framebufferTexture2D", "no text
ure or texture not from this context"); |
| 1963 return; | 1963 return; |
| 1964 } | 1964 } |
| 1965 // Don't allow the default framebuffer to be mutated; all current | 1965 // Don't allow the default framebuffer to be mutated; all current |
| 1966 // implementations use an FBO internally in place of the default | 1966 // implementations use an FBO internally in place of the default |
| 1967 // FBO. | 1967 // FBO. |
| 1968 if (!m_framebufferBinding || !m_framebufferBinding->object()) { | 1968 if (!m_framebufferBinding || !m_framebufferBinding->object()) { |
| 1969 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "framebufferText
ure2D", "no framebuffer bound"); | 1969 synthesizeGLError(GL_INVALID_OPERATION, "framebufferTexture2D", "no fram
ebuffer bound"); |
| 1970 return; | 1970 return; |
| 1971 } | 1971 } |
| 1972 Platform3DObject textureObject = objectOrZero(texture); | 1972 Platform3DObject textureObject = objectOrZero(texture); |
| 1973 switch (attachment) { | 1973 switch (attachment) { |
| 1974 case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT: | 1974 case GC3D_DEPTH_STENCIL_ATTACHMENT: |
| 1975 m_context->framebufferTexture2D(target, GraphicsContext3D::DEPTH_ATTACHM
ENT, textarget, textureObject, level); | 1975 m_context->framebufferTexture2D(target, GL_DEPTH_ATTACHMENT, textarget,
textureObject, level); |
| 1976 m_context->framebufferTexture2D(target, GraphicsContext3D::STENCIL_ATTAC
HMENT, textarget, textureObject, level); | 1976 m_context->framebufferTexture2D(target, GL_STENCIL_ATTACHMENT, textarget
, textureObject, level); |
| 1977 break; | 1977 break; |
| 1978 case GraphicsContext3D::DEPTH_ATTACHMENT: | 1978 case GL_DEPTH_ATTACHMENT: |
| 1979 m_context->framebufferTexture2D(target, attachment, textarget, textureOb
ject, level); | 1979 m_context->framebufferTexture2D(target, attachment, textarget, textureOb
ject, level); |
| 1980 break; | 1980 break; |
| 1981 case GraphicsContext3D::STENCIL_ATTACHMENT: | 1981 case GL_STENCIL_ATTACHMENT: |
| 1982 m_context->framebufferTexture2D(target, attachment, textarget, textureOb
ject, level); | 1982 m_context->framebufferTexture2D(target, attachment, textarget, textureOb
ject, level); |
| 1983 break; | 1983 break; |
| 1984 default: | 1984 default: |
| 1985 m_context->framebufferTexture2D(target, attachment, textarget, textureOb
ject, level); | 1985 m_context->framebufferTexture2D(target, attachment, textarget, textureOb
ject, level); |
| 1986 } | 1986 } |
| 1987 m_framebufferBinding->setAttachmentForBoundFramebuffer(attachment, textarget
, texture, level); | 1987 m_framebufferBinding->setAttachmentForBoundFramebuffer(attachment, textarget
, texture, level); |
| 1988 applyStencilTest(); | 1988 applyStencilTest(); |
| 1989 } | 1989 } |
| 1990 | 1990 |
| 1991 void WebGLRenderingContext::frontFace(GC3Denum mode) | 1991 void WebGLRenderingContext::frontFace(GC3Denum mode) |
| 1992 { | 1992 { |
| 1993 if (isContextLost()) | 1993 if (isContextLost()) |
| 1994 return; | 1994 return; |
| 1995 switch (mode) { | 1995 switch (mode) { |
| 1996 case GraphicsContext3D::CW: | 1996 case GL_CW: |
| 1997 case GraphicsContext3D::CCW: | 1997 case GL_CCW: |
| 1998 break; | 1998 break; |
| 1999 default: | 1999 default: |
| 2000 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "frontFace", "invalid
mode"); | 2000 synthesizeGLError(GL_INVALID_ENUM, "frontFace", "invalid mode"); |
| 2001 return; | 2001 return; |
| 2002 } | 2002 } |
| 2003 m_context->frontFace(mode); | 2003 m_context->frontFace(mode); |
| 2004 } | 2004 } |
| 2005 | 2005 |
| 2006 void WebGLRenderingContext::generateMipmap(GC3Denum target) | 2006 void WebGLRenderingContext::generateMipmap(GC3Denum target) |
| 2007 { | 2007 { |
| 2008 if (isContextLost()) | 2008 if (isContextLost()) |
| 2009 return; | 2009 return; |
| 2010 WebGLTexture* tex = validateTextureBinding("generateMipmap", target, false); | 2010 WebGLTexture* tex = validateTextureBinding("generateMipmap", target, false); |
| 2011 if (!tex) | 2011 if (!tex) |
| 2012 return; | 2012 return; |
| 2013 if (!tex->canGenerateMipmaps()) { | 2013 if (!tex->canGenerateMipmaps()) { |
| 2014 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "generateMipmap"
, "level 0 not power of 2 or not all the same size"); | 2014 synthesizeGLError(GL_INVALID_OPERATION, "generateMipmap", "level 0 not p
ower of 2 or not all the same size"); |
| 2015 return; | 2015 return; |
| 2016 } | 2016 } |
| 2017 if (!validateSettableTexFormat("generateMipmap", tex->getInternalFormat(targ
et, 0))) | 2017 if (!validateSettableTexFormat("generateMipmap", tex->getInternalFormat(targ
et, 0))) |
| 2018 return; | 2018 return; |
| 2019 | 2019 |
| 2020 // generateMipmap won't work properly if minFilter is not NEAREST_MIPMAP_LIN
EAR | 2020 // generateMipmap won't work properly if minFilter is not NEAREST_MIPMAP_LIN
EAR |
| 2021 // on Mac. Remove the hack once this driver bug is fixed. | 2021 // on Mac. Remove the hack once this driver bug is fixed. |
| 2022 #if OS(MACOSX) | 2022 #if OS(MACOSX) |
| 2023 bool needToResetMinFilter = false; | 2023 bool needToResetMinFilter = false; |
| 2024 if (tex->getMinFilter() != GraphicsContext3D::NEAREST_MIPMAP_LINEAR) { | 2024 if (tex->getMinFilter() != GL_NEAREST_MIPMAP_LINEAR) { |
| 2025 m_context->texParameteri(target, GraphicsContext3D::TEXTURE_MIN_FILTER,
GraphicsContext3D::NEAREST_MIPMAP_LINEAR); | 2025 m_context->texParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMA
P_LINEAR); |
| 2026 needToResetMinFilter = true; | 2026 needToResetMinFilter = true; |
| 2027 } | 2027 } |
| 2028 #endif | 2028 #endif |
| 2029 m_context->generateMipmap(target); | 2029 m_context->generateMipmap(target); |
| 2030 #if OS(MACOSX) | 2030 #if OS(MACOSX) |
| 2031 if (needToResetMinFilter) | 2031 if (needToResetMinFilter) |
| 2032 m_context->texParameteri(target, GraphicsContext3D::TEXTURE_MIN_FILTER,
tex->getMinFilter()); | 2032 m_context->texParameteri(target, GL_TEXTURE_MIN_FILTER, tex->getMinFilte
r()); |
| 2033 #endif | 2033 #endif |
| 2034 tex->generateMipmapLevelInfo(); | 2034 tex->generateMipmapLevelInfo(); |
| 2035 } | 2035 } |
| 2036 | 2036 |
| 2037 PassRefPtr<WebGLActiveInfo> WebGLRenderingContext::getActiveAttrib(WebGLProgram*
program, GC3Duint index) | 2037 PassRefPtr<WebGLActiveInfo> WebGLRenderingContext::getActiveAttrib(WebGLProgram*
program, GC3Duint index) |
| 2038 { | 2038 { |
| 2039 if (isContextLost() || !validateWebGLObject("getActiveAttrib", program)) | 2039 if (isContextLost() || !validateWebGLObject("getActiveAttrib", program)) |
| 2040 return 0; | 2040 return 0; |
| 2041 ActiveInfo info; | 2041 ActiveInfo info; |
| 2042 if (!m_context->getActiveAttrib(objectOrZero(program), index, info)) | 2042 if (!m_context->getActiveAttrib(objectOrZero(program), index, info)) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2054 return WebGLActiveInfo::create(info.name, info.type, info.size); | 2054 return WebGLActiveInfo::create(info.name, info.type, info.size); |
| 2055 } | 2055 } |
| 2056 | 2056 |
| 2057 bool WebGLRenderingContext::getAttachedShaders(WebGLProgram* program, Vector<Ref
Ptr<WebGLShader> >& shaderObjects) | 2057 bool WebGLRenderingContext::getAttachedShaders(WebGLProgram* program, Vector<Ref
Ptr<WebGLShader> >& shaderObjects) |
| 2058 { | 2058 { |
| 2059 shaderObjects.clear(); | 2059 shaderObjects.clear(); |
| 2060 if (isContextLost() || !validateWebGLObject("getAttachedShaders", program)) | 2060 if (isContextLost() || !validateWebGLObject("getAttachedShaders", program)) |
| 2061 return false; | 2061 return false; |
| 2062 | 2062 |
| 2063 const GC3Denum shaderType[] = { | 2063 const GC3Denum shaderType[] = { |
| 2064 GraphicsContext3D::VERTEX_SHADER, | 2064 GL_VERTEX_SHADER, |
| 2065 GraphicsContext3D::FRAGMENT_SHADER | 2065 GL_FRAGMENT_SHADER |
| 2066 }; | 2066 }; |
| 2067 for (unsigned i = 0; i < sizeof(shaderType) / sizeof(GC3Denum); ++i) { | 2067 for (unsigned i = 0; i < sizeof(shaderType) / sizeof(GC3Denum); ++i) { |
| 2068 WebGLShader* shader = program->getAttachedShader(shaderType[i]); | 2068 WebGLShader* shader = program->getAttachedShader(shaderType[i]); |
| 2069 if (shader) | 2069 if (shader) |
| 2070 shaderObjects.append(shader); | 2070 shaderObjects.append(shader); |
| 2071 } | 2071 } |
| 2072 return true; | 2072 return true; |
| 2073 } | 2073 } |
| 2074 | 2074 |
| 2075 GC3Dint WebGLRenderingContext::getAttribLocation(WebGLProgram* program, const St
ring& name) | 2075 GC3Dint WebGLRenderingContext::getAttribLocation(WebGLProgram* program, const St
ring& name) |
| 2076 { | 2076 { |
| 2077 if (isContextLost() || !validateWebGLObject("getAttribLocation", program)) | 2077 if (isContextLost() || !validateWebGLObject("getAttribLocation", program)) |
| 2078 return -1; | 2078 return -1; |
| 2079 if (!validateLocationLength("getAttribLocation", name)) | 2079 if (!validateLocationLength("getAttribLocation", name)) |
| 2080 return -1; | 2080 return -1; |
| 2081 if (!validateString("getAttribLocation", name)) | 2081 if (!validateString("getAttribLocation", name)) |
| 2082 return -1; | 2082 return -1; |
| 2083 if (isPrefixReserved(name)) | 2083 if (isPrefixReserved(name)) |
| 2084 return -1; | 2084 return -1; |
| 2085 if (!program->linkStatus()) { | 2085 if (!program->linkStatus()) { |
| 2086 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "getAttribLocati
on", "program not linked"); | 2086 synthesizeGLError(GL_INVALID_OPERATION, "getAttribLocation", "program no
t linked"); |
| 2087 return 0; | 2087 return 0; |
| 2088 } | 2088 } |
| 2089 return m_context->getAttribLocation(objectOrZero(program), name); | 2089 return m_context->getAttribLocation(objectOrZero(program), name); |
| 2090 } | 2090 } |
| 2091 | 2091 |
| 2092 WebGLGetInfo WebGLRenderingContext::getBufferParameter(GC3Denum target, GC3Denum
pname) | 2092 WebGLGetInfo WebGLRenderingContext::getBufferParameter(GC3Denum target, GC3Denum
pname) |
| 2093 { | 2093 { |
| 2094 if (isContextLost()) | 2094 if (isContextLost()) |
| 2095 return WebGLGetInfo(); | 2095 return WebGLGetInfo(); |
| 2096 if (target != GraphicsContext3D::ARRAY_BUFFER && target != GraphicsContext3D
::ELEMENT_ARRAY_BUFFER) { | 2096 if (target != GL_ARRAY_BUFFER && target != GL_ELEMENT_ARRAY_BUFFER) { |
| 2097 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getBufferParameter",
"invalid target"); | 2097 synthesizeGLError(GL_INVALID_ENUM, "getBufferParameter", "invalid target
"); |
| 2098 return WebGLGetInfo(); | 2098 return WebGLGetInfo(); |
| 2099 } | 2099 } |
| 2100 | 2100 |
| 2101 if (pname != GraphicsContext3D::BUFFER_SIZE && pname != GraphicsContext3D::B
UFFER_USAGE) { | 2101 if (pname != GL_BUFFER_SIZE && pname != GL_BUFFER_USAGE) { |
| 2102 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getBufferParameter",
"invalid parameter name"); | 2102 synthesizeGLError(GL_INVALID_ENUM, "getBufferParameter", "invalid parame
ter name"); |
| 2103 return WebGLGetInfo(); | 2103 return WebGLGetInfo(); |
| 2104 } | 2104 } |
| 2105 | 2105 |
| 2106 GC3Dint value = 0; | 2106 GC3Dint value = 0; |
| 2107 m_context->getBufferParameteriv(target, pname, &value); | 2107 m_context->getBufferParameteriv(target, pname, &value); |
| 2108 if (pname == GraphicsContext3D::BUFFER_SIZE) | 2108 if (pname == GL_BUFFER_SIZE) |
| 2109 return WebGLGetInfo(value); | 2109 return WebGLGetInfo(value); |
| 2110 return WebGLGetInfo(static_cast<unsigned int>(value)); | 2110 return WebGLGetInfo(static_cast<unsigned int>(value)); |
| 2111 } | 2111 } |
| 2112 | 2112 |
| 2113 PassRefPtr<WebGLContextAttributes> WebGLRenderingContext::getContextAttributes() | 2113 PassRefPtr<WebGLContextAttributes> WebGLRenderingContext::getContextAttributes() |
| 2114 { | 2114 { |
| 2115 if (isContextLost()) | 2115 if (isContextLost()) |
| 2116 return 0; | 2116 return 0; |
| 2117 // We always need to return a new WebGLContextAttributes object to | 2117 // We always need to return a new WebGLContextAttributes object to |
| 2118 // prevent the user from mutating any cached version. | 2118 // prevent the user from mutating any cached version. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2133 | 2133 |
| 2134 GC3Denum WebGLRenderingContext::getError() | 2134 GC3Denum WebGLRenderingContext::getError() |
| 2135 { | 2135 { |
| 2136 if (lost_context_errors_.size()) { | 2136 if (lost_context_errors_.size()) { |
| 2137 GC3Denum err = lost_context_errors_.first(); | 2137 GC3Denum err = lost_context_errors_.first(); |
| 2138 lost_context_errors_.remove(0); | 2138 lost_context_errors_.remove(0); |
| 2139 return err; | 2139 return err; |
| 2140 } | 2140 } |
| 2141 | 2141 |
| 2142 if (isContextLost()) | 2142 if (isContextLost()) |
| 2143 return GraphicsContext3D::NO_ERROR; | 2143 return GL_NO_ERROR; |
| 2144 | 2144 |
| 2145 return m_context->getError(); | 2145 return m_context->getError(); |
| 2146 } | 2146 } |
| 2147 | 2147 |
| 2148 bool WebGLRenderingContext::ExtensionTracker::matchesNameWithPrefixes(const Stri
ng& name) const | 2148 bool WebGLRenderingContext::ExtensionTracker::matchesNameWithPrefixes(const Stri
ng& name) const |
| 2149 { | 2149 { |
| 2150 static const char* const unprefixed[] = { "", 0, }; | 2150 static const char* const unprefixed[] = { "", 0, }; |
| 2151 | 2151 |
| 2152 const char* const* prefixes = m_prefixes ? m_prefixes : unprefixed; | 2152 const char* const* prefixes = m_prefixes ? m_prefixes : unprefixed; |
| 2153 for (; *prefixes; ++prefixes) { | 2153 for (; *prefixes; ++prefixes) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 2181 | 2181 |
| 2182 return 0; | 2182 return 0; |
| 2183 } | 2183 } |
| 2184 | 2184 |
| 2185 WebGLGetInfo WebGLRenderingContext::getFramebufferAttachmentParameter(GC3Denum t
arget, GC3Denum attachment, GC3Denum pname) | 2185 WebGLGetInfo WebGLRenderingContext::getFramebufferAttachmentParameter(GC3Denum t
arget, GC3Denum attachment, GC3Denum pname) |
| 2186 { | 2186 { |
| 2187 if (isContextLost() || !validateFramebufferFuncParameters("getFramebufferAtt
achmentParameter", target, attachment)) | 2187 if (isContextLost() || !validateFramebufferFuncParameters("getFramebufferAtt
achmentParameter", target, attachment)) |
| 2188 return WebGLGetInfo(); | 2188 return WebGLGetInfo(); |
| 2189 | 2189 |
| 2190 if (!m_framebufferBinding || !m_framebufferBinding->object()) { | 2190 if (!m_framebufferBinding || !m_framebufferBinding->object()) { |
| 2191 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "getFramebufferA
ttachmentParameter", "no framebuffer bound"); | 2191 synthesizeGLError(GL_INVALID_OPERATION, "getFramebufferAttachmentParamet
er", "no framebuffer bound"); |
| 2192 return WebGLGetInfo(); | 2192 return WebGLGetInfo(); |
| 2193 } | 2193 } |
| 2194 | 2194 |
| 2195 WebGLSharedObject* object = m_framebufferBinding->getAttachmentObject(attach
ment); | 2195 WebGLSharedObject* object = m_framebufferBinding->getAttachmentObject(attach
ment); |
| 2196 if (!object) { | 2196 if (!object) { |
| 2197 if (pname == GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) | 2197 if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) |
| 2198 return WebGLGetInfo(GraphicsContext3D::NONE); | 2198 return WebGLGetInfo(GL_NONE); |
| 2199 // OpenGL ES 2.0 specifies INVALID_ENUM in this case, while desktop GL | 2199 // OpenGL ES 2.0 specifies INVALID_ENUM in this case, while desktop GL |
| 2200 // specifies INVALID_OPERATION. | 2200 // specifies INVALID_OPERATION. |
| 2201 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getFramebufferAttach
mentParameter", "invalid parameter name"); | 2201 synthesizeGLError(GL_INVALID_ENUM, "getFramebufferAttachmentParameter",
"invalid parameter name"); |
| 2202 return WebGLGetInfo(); | 2202 return WebGLGetInfo(); |
| 2203 } | 2203 } |
| 2204 | 2204 |
| 2205 ASSERT(object->isTexture() || object->isRenderbuffer()); | 2205 ASSERT(object->isTexture() || object->isRenderbuffer()); |
| 2206 if (object->isTexture()) { | 2206 if (object->isTexture()) { |
| 2207 switch (pname) { | 2207 switch (pname) { |
| 2208 case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: | 2208 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: |
| 2209 return WebGLGetInfo(GraphicsContext3D::TEXTURE); | 2209 return WebGLGetInfo(GL_TEXTURE); |
| 2210 case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: | 2210 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: |
| 2211 return WebGLGetInfo(PassRefPtr<WebGLTexture>(static_cast<WebGLTextur
e*>(object))); | 2211 return WebGLGetInfo(PassRefPtr<WebGLTexture>(static_cast<WebGLTextur
e*>(object))); |
| 2212 case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: | 2212 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: |
| 2213 case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: | 2213 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: |
| 2214 { | 2214 { |
| 2215 GC3Dint value = 0; | 2215 GC3Dint value = 0; |
| 2216 m_context->getFramebufferAttachmentParameteriv(target, attachmen
t, pname, &value); | 2216 m_context->getFramebufferAttachmentParameteriv(target, attachmen
t, pname, &value); |
| 2217 return WebGLGetInfo(value); | 2217 return WebGLGetInfo(value); |
| 2218 } | 2218 } |
| 2219 default: | 2219 default: |
| 2220 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getFramebufferAt
tachmentParameter", "invalid parameter name for texture attachment"); | 2220 synthesizeGLError(GL_INVALID_ENUM, "getFramebufferAttachmentParamete
r", "invalid parameter name for texture attachment"); |
| 2221 return WebGLGetInfo(); | 2221 return WebGLGetInfo(); |
| 2222 } | 2222 } |
| 2223 } else { | 2223 } else { |
| 2224 switch (pname) { | 2224 switch (pname) { |
| 2225 case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: | 2225 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: |
| 2226 return WebGLGetInfo(GraphicsContext3D::RENDERBUFFER); | 2226 return WebGLGetInfo(GL_RENDERBUFFER); |
| 2227 case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: | 2227 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: |
| 2228 return WebGLGetInfo(PassRefPtr<WebGLRenderbuffer>(static_cast<WebGLR
enderbuffer*>(object))); | 2228 return WebGLGetInfo(PassRefPtr<WebGLRenderbuffer>(static_cast<WebGLR
enderbuffer*>(object))); |
| 2229 default: | 2229 default: |
| 2230 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getFramebufferAt
tachmentParameter", "invalid parameter name for renderbuffer attachment"); | 2230 synthesizeGLError(GL_INVALID_ENUM, "getFramebufferAttachmentParamete
r", "invalid parameter name for renderbuffer attachment"); |
| 2231 return WebGLGetInfo(); | 2231 return WebGLGetInfo(); |
| 2232 } | 2232 } |
| 2233 } | 2233 } |
| 2234 } | 2234 } |
| 2235 | 2235 |
| 2236 WebGLGetInfo WebGLRenderingContext::getParameter(GC3Denum pname) | 2236 WebGLGetInfo WebGLRenderingContext::getParameter(GC3Denum pname) |
| 2237 { | 2237 { |
| 2238 if (isContextLost()) | 2238 if (isContextLost()) |
| 2239 return WebGLGetInfo(); | 2239 return WebGLGetInfo(); |
| 2240 const int intZero = 0; | 2240 const int intZero = 0; |
| 2241 switch (pname) { | 2241 switch (pname) { |
| 2242 case GraphicsContext3D::ACTIVE_TEXTURE: | 2242 case GL_ACTIVE_TEXTURE: |
| 2243 return getUnsignedIntParameter(pname); | 2243 return getUnsignedIntParameter(pname); |
| 2244 case GraphicsContext3D::ALIASED_LINE_WIDTH_RANGE: | 2244 case GL_ALIASED_LINE_WIDTH_RANGE: |
| 2245 return getWebGLFloatArrayParameter(pname); | 2245 return getWebGLFloatArrayParameter(pname); |
| 2246 case GraphicsContext3D::ALIASED_POINT_SIZE_RANGE: | 2246 case GL_ALIASED_POINT_SIZE_RANGE: |
| 2247 return getWebGLFloatArrayParameter(pname); | 2247 return getWebGLFloatArrayParameter(pname); |
| 2248 case GraphicsContext3D::ALPHA_BITS: | 2248 case GL_ALPHA_BITS: |
| 2249 return getIntParameter(pname); | 2249 return getIntParameter(pname); |
| 2250 case GraphicsContext3D::ARRAY_BUFFER_BINDING: | 2250 case GL_ARRAY_BUFFER_BINDING: |
| 2251 return WebGLGetInfo(PassRefPtr<WebGLBuffer>(m_boundArrayBuffer)); | 2251 return WebGLGetInfo(PassRefPtr<WebGLBuffer>(m_boundArrayBuffer)); |
| 2252 case GraphicsContext3D::BLEND: | 2252 case GL_BLEND: |
| 2253 return getBooleanParameter(pname); | 2253 return getBooleanParameter(pname); |
| 2254 case GraphicsContext3D::BLEND_COLOR: | 2254 case GL_BLEND_COLOR: |
| 2255 return getWebGLFloatArrayParameter(pname); | 2255 return getWebGLFloatArrayParameter(pname); |
| 2256 case GraphicsContext3D::BLEND_DST_ALPHA: | 2256 case GL_BLEND_DST_ALPHA: |
| 2257 return getUnsignedIntParameter(pname); | 2257 return getUnsignedIntParameter(pname); |
| 2258 case GraphicsContext3D::BLEND_DST_RGB: | 2258 case GL_BLEND_DST_RGB: |
| 2259 return getUnsignedIntParameter(pname); | 2259 return getUnsignedIntParameter(pname); |
| 2260 case GraphicsContext3D::BLEND_EQUATION_ALPHA: | 2260 case GL_BLEND_EQUATION_ALPHA: |
| 2261 return getUnsignedIntParameter(pname); | 2261 return getUnsignedIntParameter(pname); |
| 2262 case GraphicsContext3D::BLEND_EQUATION_RGB: | 2262 case GL_BLEND_EQUATION_RGB: |
| 2263 return getUnsignedIntParameter(pname); | 2263 return getUnsignedIntParameter(pname); |
| 2264 case GraphicsContext3D::BLEND_SRC_ALPHA: | 2264 case GL_BLEND_SRC_ALPHA: |
| 2265 return getUnsignedIntParameter(pname); | 2265 return getUnsignedIntParameter(pname); |
| 2266 case GraphicsContext3D::BLEND_SRC_RGB: | 2266 case GL_BLEND_SRC_RGB: |
| 2267 return getUnsignedIntParameter(pname); | 2267 return getUnsignedIntParameter(pname); |
| 2268 case GraphicsContext3D::BLUE_BITS: | 2268 case GL_BLUE_BITS: |
| 2269 return getIntParameter(pname); | 2269 return getIntParameter(pname); |
| 2270 case GraphicsContext3D::COLOR_CLEAR_VALUE: | 2270 case GL_COLOR_CLEAR_VALUE: |
| 2271 return getWebGLFloatArrayParameter(pname); | 2271 return getWebGLFloatArrayParameter(pname); |
| 2272 case GraphicsContext3D::COLOR_WRITEMASK: | 2272 case GL_COLOR_WRITEMASK: |
| 2273 return getBooleanArrayParameter(pname); | 2273 return getBooleanArrayParameter(pname); |
| 2274 case GraphicsContext3D::COMPRESSED_TEXTURE_FORMATS: | 2274 case GL_COMPRESSED_TEXTURE_FORMATS: |
| 2275 return WebGLGetInfo(Uint32Array::create(m_compressedTextureFormats.data(
), m_compressedTextureFormats.size())); | 2275 return WebGLGetInfo(Uint32Array::create(m_compressedTextureFormats.data(
), m_compressedTextureFormats.size())); |
| 2276 case GraphicsContext3D::CULL_FACE: | 2276 case GL_CULL_FACE: |
| 2277 return getBooleanParameter(pname); | 2277 return getBooleanParameter(pname); |
| 2278 case GraphicsContext3D::CULL_FACE_MODE: | 2278 case GL_CULL_FACE_MODE: |
| 2279 return getUnsignedIntParameter(pname); | 2279 return getUnsignedIntParameter(pname); |
| 2280 case GraphicsContext3D::CURRENT_PROGRAM: | 2280 case GL_CURRENT_PROGRAM: |
| 2281 return WebGLGetInfo(PassRefPtr<WebGLProgram>(m_currentProgram)); | 2281 return WebGLGetInfo(PassRefPtr<WebGLProgram>(m_currentProgram)); |
| 2282 case GraphicsContext3D::DEPTH_BITS: | 2282 case GL_DEPTH_BITS: |
| 2283 if (!m_framebufferBinding && !m_attributes.depth) | 2283 if (!m_framebufferBinding && !m_attributes.depth) |
| 2284 return WebGLGetInfo(intZero); | 2284 return WebGLGetInfo(intZero); |
| 2285 return getIntParameter(pname); | 2285 return getIntParameter(pname); |
| 2286 case GraphicsContext3D::DEPTH_CLEAR_VALUE: | 2286 case GL_DEPTH_CLEAR_VALUE: |
| 2287 return getFloatParameter(pname); | 2287 return getFloatParameter(pname); |
| 2288 case GraphicsContext3D::DEPTH_FUNC: | 2288 case GL_DEPTH_FUNC: |
| 2289 return getUnsignedIntParameter(pname); | 2289 return getUnsignedIntParameter(pname); |
| 2290 case GraphicsContext3D::DEPTH_RANGE: | 2290 case GL_DEPTH_RANGE: |
| 2291 return getWebGLFloatArrayParameter(pname); | 2291 return getWebGLFloatArrayParameter(pname); |
| 2292 case GraphicsContext3D::DEPTH_TEST: | 2292 case GL_DEPTH_TEST: |
| 2293 return getBooleanParameter(pname); | 2293 return getBooleanParameter(pname); |
| 2294 case GraphicsContext3D::DEPTH_WRITEMASK: | 2294 case GL_DEPTH_WRITEMASK: |
| 2295 return getBooleanParameter(pname); | 2295 return getBooleanParameter(pname); |
| 2296 case GraphicsContext3D::DITHER: | 2296 case GL_DITHER: |
| 2297 return getBooleanParameter(pname); | 2297 return getBooleanParameter(pname); |
| 2298 case GraphicsContext3D::ELEMENT_ARRAY_BUFFER_BINDING: | 2298 case GL_ELEMENT_ARRAY_BUFFER_BINDING: |
| 2299 return WebGLGetInfo(PassRefPtr<WebGLBuffer>(m_boundVertexArrayObject->bo
undElementArrayBuffer())); | 2299 return WebGLGetInfo(PassRefPtr<WebGLBuffer>(m_boundVertexArrayObject->bo
undElementArrayBuffer())); |
| 2300 case GraphicsContext3D::FRAMEBUFFER_BINDING: | 2300 case GL_FRAMEBUFFER_BINDING: |
| 2301 return WebGLGetInfo(PassRefPtr<WebGLFramebuffer>(m_framebufferBinding)); | 2301 return WebGLGetInfo(PassRefPtr<WebGLFramebuffer>(m_framebufferBinding)); |
| 2302 case GraphicsContext3D::FRONT_FACE: | 2302 case GL_FRONT_FACE: |
| 2303 return getUnsignedIntParameter(pname); | 2303 return getUnsignedIntParameter(pname); |
| 2304 case GraphicsContext3D::GENERATE_MIPMAP_HINT: | 2304 case GL_GENERATE_MIPMAP_HINT: |
| 2305 return getUnsignedIntParameter(pname); | 2305 return getUnsignedIntParameter(pname); |
| 2306 case GraphicsContext3D::GREEN_BITS: | 2306 case GL_GREEN_BITS: |
| 2307 return getIntParameter(pname); | 2307 return getIntParameter(pname); |
| 2308 case GraphicsContext3D::LINE_WIDTH: | 2308 case GL_LINE_WIDTH: |
| 2309 return getFloatParameter(pname); | 2309 return getFloatParameter(pname); |
| 2310 case GraphicsContext3D::MAX_COMBINED_TEXTURE_IMAGE_UNITS: | 2310 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: |
| 2311 return getIntParameter(pname); | 2311 return getIntParameter(pname); |
| 2312 case GraphicsContext3D::MAX_CUBE_MAP_TEXTURE_SIZE: | 2312 case GL_MAX_CUBE_MAP_TEXTURE_SIZE: |
| 2313 return getIntParameter(pname); | 2313 return getIntParameter(pname); |
| 2314 case GraphicsContext3D::MAX_FRAGMENT_UNIFORM_VECTORS: | 2314 case GL_MAX_FRAGMENT_UNIFORM_VECTORS: |
| 2315 return getIntParameter(pname); | 2315 return getIntParameter(pname); |
| 2316 case GraphicsContext3D::MAX_RENDERBUFFER_SIZE: | 2316 case GL_MAX_RENDERBUFFER_SIZE: |
| 2317 return getIntParameter(pname); | 2317 return getIntParameter(pname); |
| 2318 case GraphicsContext3D::MAX_TEXTURE_IMAGE_UNITS: | 2318 case GL_MAX_TEXTURE_IMAGE_UNITS: |
| 2319 return getIntParameter(pname); | 2319 return getIntParameter(pname); |
| 2320 case GraphicsContext3D::MAX_TEXTURE_SIZE: | 2320 case GL_MAX_TEXTURE_SIZE: |
| 2321 return getIntParameter(pname); | 2321 return getIntParameter(pname); |
| 2322 case GraphicsContext3D::MAX_VARYING_VECTORS: | 2322 case GL_MAX_VARYING_VECTORS: |
| 2323 return getIntParameter(pname); | 2323 return getIntParameter(pname); |
| 2324 case GraphicsContext3D::MAX_VERTEX_ATTRIBS: | 2324 case GL_MAX_VERTEX_ATTRIBS: |
| 2325 return getIntParameter(pname); | 2325 return getIntParameter(pname); |
| 2326 case GraphicsContext3D::MAX_VERTEX_TEXTURE_IMAGE_UNITS: | 2326 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: |
| 2327 return getIntParameter(pname); | 2327 return getIntParameter(pname); |
| 2328 case GraphicsContext3D::MAX_VERTEX_UNIFORM_VECTORS: | 2328 case GL_MAX_VERTEX_UNIFORM_VECTORS: |
| 2329 return getIntParameter(pname); | 2329 return getIntParameter(pname); |
| 2330 case GraphicsContext3D::MAX_VIEWPORT_DIMS: | 2330 case GL_MAX_VIEWPORT_DIMS: |
| 2331 return getWebGLIntArrayParameter(pname); | 2331 return getWebGLIntArrayParameter(pname); |
| 2332 case GraphicsContext3D::NUM_SHADER_BINARY_FORMATS: | 2332 case GL_NUM_SHADER_BINARY_FORMATS: |
| 2333 // FIXME: should we always return 0 for this? | 2333 // FIXME: should we always return 0 for this? |
| 2334 return getIntParameter(pname); | 2334 return getIntParameter(pname); |
| 2335 case GraphicsContext3D::PACK_ALIGNMENT: | 2335 case GL_PACK_ALIGNMENT: |
| 2336 return getIntParameter(pname); | 2336 return getIntParameter(pname); |
| 2337 case GraphicsContext3D::POLYGON_OFFSET_FACTOR: | 2337 case GL_POLYGON_OFFSET_FACTOR: |
| 2338 return getFloatParameter(pname); | 2338 return getFloatParameter(pname); |
| 2339 case GraphicsContext3D::POLYGON_OFFSET_FILL: | 2339 case GL_POLYGON_OFFSET_FILL: |
| 2340 return getBooleanParameter(pname); | 2340 return getBooleanParameter(pname); |
| 2341 case GraphicsContext3D::POLYGON_OFFSET_UNITS: | 2341 case GL_POLYGON_OFFSET_UNITS: |
| 2342 return getFloatParameter(pname); | 2342 return getFloatParameter(pname); |
| 2343 case GraphicsContext3D::RED_BITS: | 2343 case GL_RED_BITS: |
| 2344 return getIntParameter(pname); | 2344 return getIntParameter(pname); |
| 2345 case GraphicsContext3D::RENDERBUFFER_BINDING: | 2345 case GL_RENDERBUFFER_BINDING: |
| 2346 return WebGLGetInfo(PassRefPtr<WebGLRenderbuffer>(m_renderbufferBinding)
); | 2346 return WebGLGetInfo(PassRefPtr<WebGLRenderbuffer>(m_renderbufferBinding)
); |
| 2347 case GraphicsContext3D::RENDERER: | 2347 case GL_RENDERER: |
| 2348 return WebGLGetInfo(String("WebKit WebGL")); | 2348 return WebGLGetInfo(String("WebKit WebGL")); |
| 2349 case GraphicsContext3D::SAMPLE_BUFFERS: | 2349 case GL_SAMPLE_BUFFERS: |
| 2350 return getIntParameter(pname); | 2350 return getIntParameter(pname); |
| 2351 case GraphicsContext3D::SAMPLE_COVERAGE_INVERT: | 2351 case GL_SAMPLE_COVERAGE_INVERT: |
| 2352 return getBooleanParameter(pname); | 2352 return getBooleanParameter(pname); |
| 2353 case GraphicsContext3D::SAMPLE_COVERAGE_VALUE: | 2353 case GL_SAMPLE_COVERAGE_VALUE: |
| 2354 return getFloatParameter(pname); | 2354 return getFloatParameter(pname); |
| 2355 case GraphicsContext3D::SAMPLES: | 2355 case GL_SAMPLES: |
| 2356 return getIntParameter(pname); | 2356 return getIntParameter(pname); |
| 2357 case GraphicsContext3D::SCISSOR_BOX: | 2357 case GL_SCISSOR_BOX: |
| 2358 return getWebGLIntArrayParameter(pname); | 2358 return getWebGLIntArrayParameter(pname); |
| 2359 case GraphicsContext3D::SCISSOR_TEST: | 2359 case GL_SCISSOR_TEST: |
| 2360 return getBooleanParameter(pname); | 2360 return getBooleanParameter(pname); |
| 2361 case GraphicsContext3D::SHADING_LANGUAGE_VERSION: | 2361 case GL_SHADING_LANGUAGE_VERSION: |
| 2362 return WebGLGetInfo("WebGL GLSL ES 1.0 (" + m_context->getString(Graphic
sContext3D::SHADING_LANGUAGE_VERSION) + ")"); | 2362 return WebGLGetInfo("WebGL GLSL ES 1.0 (" + m_context->getString(GL_SHAD
ING_LANGUAGE_VERSION) + ")"); |
| 2363 case GraphicsContext3D::STENCIL_BACK_FAIL: | 2363 case GL_STENCIL_BACK_FAIL: |
| 2364 return getUnsignedIntParameter(pname); | 2364 return getUnsignedIntParameter(pname); |
| 2365 case GraphicsContext3D::STENCIL_BACK_FUNC: | 2365 case GL_STENCIL_BACK_FUNC: |
| 2366 return getUnsignedIntParameter(pname); | 2366 return getUnsignedIntParameter(pname); |
| 2367 case GraphicsContext3D::STENCIL_BACK_PASS_DEPTH_FAIL: | 2367 case GL_STENCIL_BACK_PASS_DEPTH_FAIL: |
| 2368 return getUnsignedIntParameter(pname); | 2368 return getUnsignedIntParameter(pname); |
| 2369 case GraphicsContext3D::STENCIL_BACK_PASS_DEPTH_PASS: | 2369 case GL_STENCIL_BACK_PASS_DEPTH_PASS: |
| 2370 return getUnsignedIntParameter(pname); | 2370 return getUnsignedIntParameter(pname); |
| 2371 case GraphicsContext3D::STENCIL_BACK_REF: | 2371 case GL_STENCIL_BACK_REF: |
| 2372 return getIntParameter(pname); | 2372 return getIntParameter(pname); |
| 2373 case GraphicsContext3D::STENCIL_BACK_VALUE_MASK: | 2373 case GL_STENCIL_BACK_VALUE_MASK: |
| 2374 return getUnsignedIntParameter(pname); | 2374 return getUnsignedIntParameter(pname); |
| 2375 case GraphicsContext3D::STENCIL_BACK_WRITEMASK: | 2375 case GL_STENCIL_BACK_WRITEMASK: |
| 2376 return getUnsignedIntParameter(pname); | 2376 return getUnsignedIntParameter(pname); |
| 2377 case GraphicsContext3D::STENCIL_BITS: | 2377 case GL_STENCIL_BITS: |
| 2378 if (!m_framebufferBinding && !m_attributes.stencil) | 2378 if (!m_framebufferBinding && !m_attributes.stencil) |
| 2379 return WebGLGetInfo(intZero); | 2379 return WebGLGetInfo(intZero); |
| 2380 return getIntParameter(pname); | 2380 return getIntParameter(pname); |
| 2381 case GraphicsContext3D::STENCIL_CLEAR_VALUE: | 2381 case GL_STENCIL_CLEAR_VALUE: |
| 2382 return getIntParameter(pname); | 2382 return getIntParameter(pname); |
| 2383 case GraphicsContext3D::STENCIL_FAIL: | 2383 case GL_STENCIL_FAIL: |
| 2384 return getUnsignedIntParameter(pname); | 2384 return getUnsignedIntParameter(pname); |
| 2385 case GraphicsContext3D::STENCIL_FUNC: | 2385 case GL_STENCIL_FUNC: |
| 2386 return getUnsignedIntParameter(pname); | 2386 return getUnsignedIntParameter(pname); |
| 2387 case GraphicsContext3D::STENCIL_PASS_DEPTH_FAIL: | 2387 case GL_STENCIL_PASS_DEPTH_FAIL: |
| 2388 return getUnsignedIntParameter(pname); | 2388 return getUnsignedIntParameter(pname); |
| 2389 case GraphicsContext3D::STENCIL_PASS_DEPTH_PASS: | 2389 case GL_STENCIL_PASS_DEPTH_PASS: |
| 2390 return getUnsignedIntParameter(pname); | 2390 return getUnsignedIntParameter(pname); |
| 2391 case GraphicsContext3D::STENCIL_REF: | 2391 case GL_STENCIL_REF: |
| 2392 return getIntParameter(pname); | 2392 return getIntParameter(pname); |
| 2393 case GraphicsContext3D::STENCIL_TEST: | 2393 case GL_STENCIL_TEST: |
| 2394 return getBooleanParameter(pname); | 2394 return getBooleanParameter(pname); |
| 2395 case GraphicsContext3D::STENCIL_VALUE_MASK: | 2395 case GL_STENCIL_VALUE_MASK: |
| 2396 return getUnsignedIntParameter(pname); | 2396 return getUnsignedIntParameter(pname); |
| 2397 case GraphicsContext3D::STENCIL_WRITEMASK: | 2397 case GL_STENCIL_WRITEMASK: |
| 2398 return getUnsignedIntParameter(pname); | 2398 return getUnsignedIntParameter(pname); |
| 2399 case GraphicsContext3D::SUBPIXEL_BITS: | 2399 case GL_SUBPIXEL_BITS: |
| 2400 return getIntParameter(pname); | 2400 return getIntParameter(pname); |
| 2401 case GraphicsContext3D::TEXTURE_BINDING_2D: | 2401 case GL_TEXTURE_BINDING_2D: |
| 2402 return WebGLGetInfo(PassRefPtr<WebGLTexture>(m_textureUnits[m_activeText
ureUnit].m_texture2DBinding)); | 2402 return WebGLGetInfo(PassRefPtr<WebGLTexture>(m_textureUnits[m_activeText
ureUnit].m_texture2DBinding)); |
| 2403 case GraphicsContext3D::TEXTURE_BINDING_CUBE_MAP: | 2403 case GL_TEXTURE_BINDING_CUBE_MAP: |
| 2404 return WebGLGetInfo(PassRefPtr<WebGLTexture>(m_textureUnits[m_activeText
ureUnit].m_textureCubeMapBinding)); | 2404 return WebGLGetInfo(PassRefPtr<WebGLTexture>(m_textureUnits[m_activeText
ureUnit].m_textureCubeMapBinding)); |
| 2405 case GraphicsContext3D::UNPACK_ALIGNMENT: | 2405 case GL_UNPACK_ALIGNMENT: |
| 2406 return getIntParameter(pname); | 2406 return getIntParameter(pname); |
| 2407 case GraphicsContext3D::UNPACK_FLIP_Y_WEBGL: | 2407 case GC3D_UNPACK_FLIP_Y_WEBGL: |
| 2408 return WebGLGetInfo(m_unpackFlipY); | 2408 return WebGLGetInfo(m_unpackFlipY); |
| 2409 case GraphicsContext3D::UNPACK_PREMULTIPLY_ALPHA_WEBGL: | 2409 case GC3D_UNPACK_PREMULTIPLY_ALPHA_WEBGL: |
| 2410 return WebGLGetInfo(m_unpackPremultiplyAlpha); | 2410 return WebGLGetInfo(m_unpackPremultiplyAlpha); |
| 2411 case GraphicsContext3D::UNPACK_COLORSPACE_CONVERSION_WEBGL: | 2411 case GC3D_UNPACK_COLORSPACE_CONVERSION_WEBGL: |
| 2412 return WebGLGetInfo(m_unpackColorspaceConversion); | 2412 return WebGLGetInfo(m_unpackColorspaceConversion); |
| 2413 case GraphicsContext3D::VENDOR: | 2413 case GL_VENDOR: |
| 2414 return WebGLGetInfo(String("WebKit")); | 2414 return WebGLGetInfo(String("WebKit")); |
| 2415 case GraphicsContext3D::VERSION: | 2415 case GL_VERSION: |
| 2416 return WebGLGetInfo("WebGL 1.0 (" + m_context->getString(GraphicsContext
3D::VERSION) + ")"); | 2416 return WebGLGetInfo("WebGL 1.0 (" + m_context->getString(GL_VERSION) + "
)"); |
| 2417 case GraphicsContext3D::VIEWPORT: | 2417 case GL_VIEWPORT: |
| 2418 return getWebGLIntArrayParameter(pname); | 2418 return getWebGLIntArrayParameter(pname); |
| 2419 case Extensions3D::FRAGMENT_SHADER_DERIVATIVE_HINT_OES: // OES_standard_deri
vatives | 2419 case Extensions3D::FRAGMENT_SHADER_DERIVATIVE_HINT_OES: // OES_standard_deri
vatives |
| 2420 if (m_oesStandardDerivatives) | 2420 if (m_oesStandardDerivatives) |
| 2421 return getUnsignedIntParameter(Extensions3D::FRAGMENT_SHADER_DERIVAT
IVE_HINT_OES); | 2421 return getUnsignedIntParameter(Extensions3D::FRAGMENT_SHADER_DERIVAT
IVE_HINT_OES); |
| 2422 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getParameter", "inva
lid parameter name, OES_standard_derivatives not enabled"); | 2422 synthesizeGLError(GL_INVALID_ENUM, "getParameter", "invalid parameter na
me, OES_standard_derivatives not enabled"); |
| 2423 return WebGLGetInfo(); | 2423 return WebGLGetInfo(); |
| 2424 case WebGLDebugRendererInfo::UNMASKED_RENDERER_WEBGL: | 2424 case WebGLDebugRendererInfo::UNMASKED_RENDERER_WEBGL: |
| 2425 if (m_webglDebugRendererInfo) | 2425 if (m_webglDebugRendererInfo) |
| 2426 return WebGLGetInfo(m_context->getString(GraphicsContext3D::RENDERER
)); | 2426 return WebGLGetInfo(m_context->getString(GL_RENDERER)); |
| 2427 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getParameter", "inva
lid parameter name, WEBGL_debug_renderer_info not enabled"); | 2427 synthesizeGLError(GL_INVALID_ENUM, "getParameter", "invalid parameter na
me, WEBGL_debug_renderer_info not enabled"); |
| 2428 return WebGLGetInfo(); | 2428 return WebGLGetInfo(); |
| 2429 case WebGLDebugRendererInfo::UNMASKED_VENDOR_WEBGL: | 2429 case WebGLDebugRendererInfo::UNMASKED_VENDOR_WEBGL: |
| 2430 if (m_webglDebugRendererInfo) | 2430 if (m_webglDebugRendererInfo) |
| 2431 return WebGLGetInfo(m_context->getString(GraphicsContext3D::VENDOR))
; | 2431 return WebGLGetInfo(m_context->getString(GL_VENDOR)); |
| 2432 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getParameter", "inva
lid parameter name, WEBGL_debug_renderer_info not enabled"); | 2432 synthesizeGLError(GL_INVALID_ENUM, "getParameter", "invalid parameter na
me, WEBGL_debug_renderer_info not enabled"); |
| 2433 return WebGLGetInfo(); | 2433 return WebGLGetInfo(); |
| 2434 case Extensions3D::VERTEX_ARRAY_BINDING_OES: // OES_vertex_array_object | 2434 case Extensions3D::VERTEX_ARRAY_BINDING_OES: // OES_vertex_array_object |
| 2435 if (m_oesVertexArrayObject) { | 2435 if (m_oesVertexArrayObject) { |
| 2436 if (!m_boundVertexArrayObject->isDefaultObject()) | 2436 if (!m_boundVertexArrayObject->isDefaultObject()) |
| 2437 return WebGLGetInfo(PassRefPtr<WebGLVertexArrayObjectOES>(m_boun
dVertexArrayObject)); | 2437 return WebGLGetInfo(PassRefPtr<WebGLVertexArrayObjectOES>(m_boun
dVertexArrayObject)); |
| 2438 return WebGLGetInfo(); | 2438 return WebGLGetInfo(); |
| 2439 } | 2439 } |
| 2440 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getParameter", "inva
lid parameter name, OES_vertex_array_object not enabled"); | 2440 synthesizeGLError(GL_INVALID_ENUM, "getParameter", "invalid parameter na
me, OES_vertex_array_object not enabled"); |
| 2441 return WebGLGetInfo(); | 2441 return WebGLGetInfo(); |
| 2442 case Extensions3D::MAX_TEXTURE_MAX_ANISOTROPY_EXT: // EXT_texture_filter_ani
sotropic | 2442 case Extensions3D::MAX_TEXTURE_MAX_ANISOTROPY_EXT: // EXT_texture_filter_ani
sotropic |
| 2443 if (m_extTextureFilterAnisotropic) | 2443 if (m_extTextureFilterAnisotropic) |
| 2444 return getUnsignedIntParameter(Extensions3D::MAX_TEXTURE_MAX_ANISOTR
OPY_EXT); | 2444 return getUnsignedIntParameter(Extensions3D::MAX_TEXTURE_MAX_ANISOTR
OPY_EXT); |
| 2445 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getParameter", "inva
lid parameter name, EXT_texture_filter_anisotropic not enabled"); | 2445 synthesizeGLError(GL_INVALID_ENUM, "getParameter", "invalid parameter na
me, EXT_texture_filter_anisotropic not enabled"); |
| 2446 return WebGLGetInfo(); | 2446 return WebGLGetInfo(); |
| 2447 case Extensions3D::MAX_COLOR_ATTACHMENTS_EXT: // EXT_draw_buffers BEGIN | 2447 case Extensions3D::MAX_COLOR_ATTACHMENTS_EXT: // EXT_draw_buffers BEGIN |
| 2448 if (m_webglDrawBuffers) | 2448 if (m_webglDrawBuffers) |
| 2449 return WebGLGetInfo(maxColorAttachments()); | 2449 return WebGLGetInfo(maxColorAttachments()); |
| 2450 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getParameter", "inva
lid parameter name, WEBGL_draw_buffers not enabled"); | 2450 synthesizeGLError(GL_INVALID_ENUM, "getParameter", "invalid parameter na
me, WEBGL_draw_buffers not enabled"); |
| 2451 return WebGLGetInfo(); | 2451 return WebGLGetInfo(); |
| 2452 case Extensions3D::MAX_DRAW_BUFFERS_EXT: | 2452 case Extensions3D::MAX_DRAW_BUFFERS_EXT: |
| 2453 if (m_webglDrawBuffers) | 2453 if (m_webglDrawBuffers) |
| 2454 return WebGLGetInfo(maxDrawBuffers()); | 2454 return WebGLGetInfo(maxDrawBuffers()); |
| 2455 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getParameter", "inva
lid parameter name, WEBGL_draw_buffers not enabled"); | 2455 synthesizeGLError(GL_INVALID_ENUM, "getParameter", "invalid parameter na
me, WEBGL_draw_buffers not enabled"); |
| 2456 return WebGLGetInfo(); | 2456 return WebGLGetInfo(); |
| 2457 default: | 2457 default: |
| 2458 if (m_webglDrawBuffers | 2458 if (m_webglDrawBuffers |
| 2459 && pname >= Extensions3D::DRAW_BUFFER0_EXT | 2459 && pname >= Extensions3D::DRAW_BUFFER0_EXT |
| 2460 && pname < static_cast<GC3Denum>(Extensions3D::DRAW_BUFFER0_EXT + ma
xDrawBuffers())) { | 2460 && pname < static_cast<GC3Denum>(Extensions3D::DRAW_BUFFER0_EXT + ma
xDrawBuffers())) { |
| 2461 GC3Dint value = GraphicsContext3D::NONE; | 2461 GC3Dint value = GL_NONE; |
| 2462 if (m_framebufferBinding) | 2462 if (m_framebufferBinding) |
| 2463 value = m_framebufferBinding->getDrawBuffer(pname); | 2463 value = m_framebufferBinding->getDrawBuffer(pname); |
| 2464 else // emulated backbuffer | 2464 else // emulated backbuffer |
| 2465 value = m_backDrawBuffer; | 2465 value = m_backDrawBuffer; |
| 2466 return WebGLGetInfo(value); | 2466 return WebGLGetInfo(value); |
| 2467 } | 2467 } |
| 2468 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getParameter", "inva
lid parameter name"); | 2468 synthesizeGLError(GL_INVALID_ENUM, "getParameter", "invalid parameter na
me"); |
| 2469 return WebGLGetInfo(); | 2469 return WebGLGetInfo(); |
| 2470 } | 2470 } |
| 2471 } | 2471 } |
| 2472 | 2472 |
| 2473 WebGLGetInfo WebGLRenderingContext::getProgramParameter(WebGLProgram* program, G
C3Denum pname) | 2473 WebGLGetInfo WebGLRenderingContext::getProgramParameter(WebGLProgram* program, G
C3Denum pname) |
| 2474 { | 2474 { |
| 2475 if (isContextLost() || !validateWebGLObject("getProgramParameter", program)) | 2475 if (isContextLost() || !validateWebGLObject("getProgramParameter", program)) |
| 2476 return WebGLGetInfo(); | 2476 return WebGLGetInfo(); |
| 2477 | 2477 |
| 2478 GC3Dint value = 0; | 2478 GC3Dint value = 0; |
| 2479 switch (pname) { | 2479 switch (pname) { |
| 2480 case GraphicsContext3D::DELETE_STATUS: | 2480 case GL_DELETE_STATUS: |
| 2481 return WebGLGetInfo(program->isDeleted()); | 2481 return WebGLGetInfo(program->isDeleted()); |
| 2482 case GraphicsContext3D::VALIDATE_STATUS: | 2482 case GL_VALIDATE_STATUS: |
| 2483 m_context->getProgramiv(objectOrZero(program), pname, &value); | 2483 m_context->getProgramiv(objectOrZero(program), pname, &value); |
| 2484 return WebGLGetInfo(static_cast<bool>(value)); | 2484 return WebGLGetInfo(static_cast<bool>(value)); |
| 2485 case GraphicsContext3D::LINK_STATUS: | 2485 case GL_LINK_STATUS: |
| 2486 return WebGLGetInfo(program->linkStatus()); | 2486 return WebGLGetInfo(program->linkStatus()); |
| 2487 case GraphicsContext3D::ATTACHED_SHADERS: | 2487 case GL_ATTACHED_SHADERS: |
| 2488 case GraphicsContext3D::ACTIVE_ATTRIBUTES: | 2488 case GL_ACTIVE_ATTRIBUTES: |
| 2489 case GraphicsContext3D::ACTIVE_UNIFORMS: | 2489 case GL_ACTIVE_UNIFORMS: |
| 2490 m_context->getProgramiv(objectOrZero(program), pname, &value); | 2490 m_context->getProgramiv(objectOrZero(program), pname, &value); |
| 2491 return WebGLGetInfo(value); | 2491 return WebGLGetInfo(value); |
| 2492 default: | 2492 default: |
| 2493 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getProgramParameter"
, "invalid parameter name"); | 2493 synthesizeGLError(GL_INVALID_ENUM, "getProgramParameter", "invalid param
eter name"); |
| 2494 return WebGLGetInfo(); | 2494 return WebGLGetInfo(); |
| 2495 } | 2495 } |
| 2496 } | 2496 } |
| 2497 | 2497 |
| 2498 String WebGLRenderingContext::getProgramInfoLog(WebGLProgram* program) | 2498 String WebGLRenderingContext::getProgramInfoLog(WebGLProgram* program) |
| 2499 { | 2499 { |
| 2500 if (isContextLost()) | 2500 if (isContextLost()) |
| 2501 return String(); | 2501 return String(); |
| 2502 if (!validateWebGLObject("getProgramInfoLog", program)) | 2502 if (!validateWebGLObject("getProgramInfoLog", program)) |
| 2503 return ""; | 2503 return ""; |
| 2504 return ensureNotNull(m_context->getProgramInfoLog(objectOrZero(program))); | 2504 return ensureNotNull(m_context->getProgramInfoLog(objectOrZero(program))); |
| 2505 } | 2505 } |
| 2506 | 2506 |
| 2507 WebGLGetInfo WebGLRenderingContext::getRenderbufferParameter(GC3Denum target, GC
3Denum pname) | 2507 WebGLGetInfo WebGLRenderingContext::getRenderbufferParameter(GC3Denum target, GC
3Denum pname) |
| 2508 { | 2508 { |
| 2509 if (isContextLost()) | 2509 if (isContextLost()) |
| 2510 return WebGLGetInfo(); | 2510 return WebGLGetInfo(); |
| 2511 if (target != GraphicsContext3D::RENDERBUFFER) { | 2511 if (target != GL_RENDERBUFFER) { |
| 2512 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getRenderbufferParam
eter", "invalid target"); | 2512 synthesizeGLError(GL_INVALID_ENUM, "getRenderbufferParameter", "invalid
target"); |
| 2513 return WebGLGetInfo(); | 2513 return WebGLGetInfo(); |
| 2514 } | 2514 } |
| 2515 if (!m_renderbufferBinding || !m_renderbufferBinding->object()) { | 2515 if (!m_renderbufferBinding || !m_renderbufferBinding->object()) { |
| 2516 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "getRenderbuffer
Parameter", "no renderbuffer bound"); | 2516 synthesizeGLError(GL_INVALID_OPERATION, "getRenderbufferParameter", "no
renderbuffer bound"); |
| 2517 return WebGLGetInfo(); | 2517 return WebGLGetInfo(); |
| 2518 } | 2518 } |
| 2519 | 2519 |
| 2520 GC3Dint value = 0; | 2520 GC3Dint value = 0; |
| 2521 switch (pname) { | 2521 switch (pname) { |
| 2522 case GraphicsContext3D::RENDERBUFFER_WIDTH: | 2522 case GL_RENDERBUFFER_WIDTH: |
| 2523 case GraphicsContext3D::RENDERBUFFER_HEIGHT: | 2523 case GL_RENDERBUFFER_HEIGHT: |
| 2524 case GraphicsContext3D::RENDERBUFFER_RED_SIZE: | 2524 case GL_RENDERBUFFER_RED_SIZE: |
| 2525 case GraphicsContext3D::RENDERBUFFER_GREEN_SIZE: | 2525 case GL_RENDERBUFFER_GREEN_SIZE: |
| 2526 case GraphicsContext3D::RENDERBUFFER_BLUE_SIZE: | 2526 case GL_RENDERBUFFER_BLUE_SIZE: |
| 2527 case GraphicsContext3D::RENDERBUFFER_ALPHA_SIZE: | 2527 case GL_RENDERBUFFER_ALPHA_SIZE: |
| 2528 case GraphicsContext3D::RENDERBUFFER_DEPTH_SIZE: | 2528 case GL_RENDERBUFFER_DEPTH_SIZE: |
| 2529 m_context->getRenderbufferParameteriv(target, pname, &value); | 2529 m_context->getRenderbufferParameteriv(target, pname, &value); |
| 2530 return WebGLGetInfo(value); | 2530 return WebGLGetInfo(value); |
| 2531 case GraphicsContext3D::RENDERBUFFER_STENCIL_SIZE: | 2531 case GL_RENDERBUFFER_STENCIL_SIZE: |
| 2532 if (m_renderbufferBinding->emulatedStencilBuffer()) { | 2532 if (m_renderbufferBinding->emulatedStencilBuffer()) { |
| 2533 m_context->bindRenderbuffer(target, objectOrZero(m_renderbufferBindi
ng->emulatedStencilBuffer())); | 2533 m_context->bindRenderbuffer(target, objectOrZero(m_renderbufferBindi
ng->emulatedStencilBuffer())); |
| 2534 m_context->getRenderbufferParameteriv(target, pname, &value); | 2534 m_context->getRenderbufferParameteriv(target, pname, &value); |
| 2535 m_context->bindRenderbuffer(target, objectOrZero(m_renderbufferBindi
ng.get())); | 2535 m_context->bindRenderbuffer(target, objectOrZero(m_renderbufferBindi
ng.get())); |
| 2536 } else { | 2536 } else { |
| 2537 m_context->getRenderbufferParameteriv(target, pname, &value); | 2537 m_context->getRenderbufferParameteriv(target, pname, &value); |
| 2538 } | 2538 } |
| 2539 return WebGLGetInfo(value); | 2539 return WebGLGetInfo(value); |
| 2540 case GraphicsContext3D::RENDERBUFFER_INTERNAL_FORMAT: | 2540 case GL_RENDERBUFFER_INTERNAL_FORMAT: |
| 2541 return WebGLGetInfo(m_renderbufferBinding->internalFormat()); | 2541 return WebGLGetInfo(m_renderbufferBinding->internalFormat()); |
| 2542 default: | 2542 default: |
| 2543 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getRenderbufferParam
eter", "invalid parameter name"); | 2543 synthesizeGLError(GL_INVALID_ENUM, "getRenderbufferParameter", "invalid
parameter name"); |
| 2544 return WebGLGetInfo(); | 2544 return WebGLGetInfo(); |
| 2545 } | 2545 } |
| 2546 } | 2546 } |
| 2547 | 2547 |
| 2548 WebGLGetInfo WebGLRenderingContext::getShaderParameter(WebGLShader* shader, GC3D
enum pname) | 2548 WebGLGetInfo WebGLRenderingContext::getShaderParameter(WebGLShader* shader, GC3D
enum pname) |
| 2549 { | 2549 { |
| 2550 if (isContextLost() || !validateWebGLObject("getShaderParameter", shader)) | 2550 if (isContextLost() || !validateWebGLObject("getShaderParameter", shader)) |
| 2551 return WebGLGetInfo(); | 2551 return WebGLGetInfo(); |
| 2552 GC3Dint value = 0; | 2552 GC3Dint value = 0; |
| 2553 switch (pname) { | 2553 switch (pname) { |
| 2554 case GraphicsContext3D::DELETE_STATUS: | 2554 case GL_DELETE_STATUS: |
| 2555 return WebGLGetInfo(shader->isDeleted()); | 2555 return WebGLGetInfo(shader->isDeleted()); |
| 2556 case GraphicsContext3D::COMPILE_STATUS: | 2556 case GL_COMPILE_STATUS: |
| 2557 m_context->getShaderiv(objectOrZero(shader), pname, &value); | 2557 m_context->getShaderiv(objectOrZero(shader), pname, &value); |
| 2558 return WebGLGetInfo(static_cast<bool>(value)); | 2558 return WebGLGetInfo(static_cast<bool>(value)); |
| 2559 case GraphicsContext3D::SHADER_TYPE: | 2559 case GL_SHADER_TYPE: |
| 2560 m_context->getShaderiv(objectOrZero(shader), pname, &value); | 2560 m_context->getShaderiv(objectOrZero(shader), pname, &value); |
| 2561 return WebGLGetInfo(static_cast<unsigned int>(value)); | 2561 return WebGLGetInfo(static_cast<unsigned int>(value)); |
| 2562 default: | 2562 default: |
| 2563 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getShaderParameter",
"invalid parameter name"); | 2563 synthesizeGLError(GL_INVALID_ENUM, "getShaderParameter", "invalid parame
ter name"); |
| 2564 return WebGLGetInfo(); | 2564 return WebGLGetInfo(); |
| 2565 } | 2565 } |
| 2566 } | 2566 } |
| 2567 | 2567 |
| 2568 String WebGLRenderingContext::getShaderInfoLog(WebGLShader* shader) | 2568 String WebGLRenderingContext::getShaderInfoLog(WebGLShader* shader) |
| 2569 { | 2569 { |
| 2570 if (isContextLost()) | 2570 if (isContextLost()) |
| 2571 return String(); | 2571 return String(); |
| 2572 if (!validateWebGLObject("getShaderInfoLog", shader)) | 2572 if (!validateWebGLObject("getShaderInfoLog", shader)) |
| 2573 return ""; | 2573 return ""; |
| 2574 return ensureNotNull(m_context->getShaderInfoLog(objectOrZero(shader))); | 2574 return ensureNotNull(m_context->getShaderInfoLog(objectOrZero(shader))); |
| 2575 } | 2575 } |
| 2576 | 2576 |
| 2577 PassRefPtr<WebGLShaderPrecisionFormat> WebGLRenderingContext::getShaderPrecision
Format(GC3Denum shaderType, GC3Denum precisionType) | 2577 PassRefPtr<WebGLShaderPrecisionFormat> WebGLRenderingContext::getShaderPrecision
Format(GC3Denum shaderType, GC3Denum precisionType) |
| 2578 { | 2578 { |
| 2579 if (isContextLost()) | 2579 if (isContextLost()) |
| 2580 return 0; | 2580 return 0; |
| 2581 switch (shaderType) { | 2581 switch (shaderType) { |
| 2582 case GraphicsContext3D::VERTEX_SHADER: | 2582 case GL_VERTEX_SHADER: |
| 2583 case GraphicsContext3D::FRAGMENT_SHADER: | 2583 case GL_FRAGMENT_SHADER: |
| 2584 break; | 2584 break; |
| 2585 default: | 2585 default: |
| 2586 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getShaderPrecisionFo
rmat", "invalid shader type"); | 2586 synthesizeGLError(GL_INVALID_ENUM, "getShaderPrecisionFormat", "invalid
shader type"); |
| 2587 return 0; | 2587 return 0; |
| 2588 } | 2588 } |
| 2589 switch (precisionType) { | 2589 switch (precisionType) { |
| 2590 case GraphicsContext3D::LOW_FLOAT: | 2590 case GL_LOW_FLOAT: |
| 2591 case GraphicsContext3D::MEDIUM_FLOAT: | 2591 case GL_MEDIUM_FLOAT: |
| 2592 case GraphicsContext3D::HIGH_FLOAT: | 2592 case GL_HIGH_FLOAT: |
| 2593 case GraphicsContext3D::LOW_INT: | 2593 case GL_LOW_INT: |
| 2594 case GraphicsContext3D::MEDIUM_INT: | 2594 case GL_MEDIUM_INT: |
| 2595 case GraphicsContext3D::HIGH_INT: | 2595 case GL_HIGH_INT: |
| 2596 break; | 2596 break; |
| 2597 default: | 2597 default: |
| 2598 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getShaderPrecisionFo
rmat", "invalid precision type"); | 2598 synthesizeGLError(GL_INVALID_ENUM, "getShaderPrecisionFormat", "invalid
precision type"); |
| 2599 return 0; | 2599 return 0; |
| 2600 } | 2600 } |
| 2601 | 2601 |
| 2602 GC3Dint range[2] = {0, 0}; | 2602 GC3Dint range[2] = {0, 0}; |
| 2603 GC3Dint precision = 0; | 2603 GC3Dint precision = 0; |
| 2604 m_context->getShaderPrecisionFormat(shaderType, precisionType, range, &preci
sion); | 2604 m_context->getShaderPrecisionFormat(shaderType, precisionType, range, &preci
sion); |
| 2605 return WebGLShaderPrecisionFormat::create(range[0], range[1], precision); | 2605 return WebGLShaderPrecisionFormat::create(range[0], range[1], precision); |
| 2606 } | 2606 } |
| 2607 | 2607 |
| 2608 String WebGLRenderingContext::getShaderSource(WebGLShader* shader) | 2608 String WebGLRenderingContext::getShaderSource(WebGLShader* shader) |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2637 | 2637 |
| 2638 WebGLGetInfo WebGLRenderingContext::getTexParameter(GC3Denum target, GC3Denum pn
ame) | 2638 WebGLGetInfo WebGLRenderingContext::getTexParameter(GC3Denum target, GC3Denum pn
ame) |
| 2639 { | 2639 { |
| 2640 if (isContextLost()) | 2640 if (isContextLost()) |
| 2641 return WebGLGetInfo(); | 2641 return WebGLGetInfo(); |
| 2642 WebGLTexture* tex = validateTextureBinding("getTexParameter", target, false)
; | 2642 WebGLTexture* tex = validateTextureBinding("getTexParameter", target, false)
; |
| 2643 if (!tex) | 2643 if (!tex) |
| 2644 return WebGLGetInfo(); | 2644 return WebGLGetInfo(); |
| 2645 GC3Dint value = 0; | 2645 GC3Dint value = 0; |
| 2646 switch (pname) { | 2646 switch (pname) { |
| 2647 case GraphicsContext3D::TEXTURE_MAG_FILTER: | 2647 case GL_TEXTURE_MAG_FILTER: |
| 2648 case GraphicsContext3D::TEXTURE_MIN_FILTER: | 2648 case GL_TEXTURE_MIN_FILTER: |
| 2649 case GraphicsContext3D::TEXTURE_WRAP_S: | 2649 case GL_TEXTURE_WRAP_S: |
| 2650 case GraphicsContext3D::TEXTURE_WRAP_T: | 2650 case GL_TEXTURE_WRAP_T: |
| 2651 m_context->getTexParameteriv(target, pname, &value); | 2651 m_context->getTexParameteriv(target, pname, &value); |
| 2652 return WebGLGetInfo(static_cast<unsigned int>(value)); | 2652 return WebGLGetInfo(static_cast<unsigned int>(value)); |
| 2653 case Extensions3D::TEXTURE_MAX_ANISOTROPY_EXT: // EXT_texture_filter_anisotr
opic | 2653 case Extensions3D::TEXTURE_MAX_ANISOTROPY_EXT: // EXT_texture_filter_anisotr
opic |
| 2654 if (m_extTextureFilterAnisotropic) { | 2654 if (m_extTextureFilterAnisotropic) { |
| 2655 m_context->getTexParameteriv(target, pname, &value); | 2655 m_context->getTexParameteriv(target, pname, &value); |
| 2656 return WebGLGetInfo(static_cast<unsigned int>(value)); | 2656 return WebGLGetInfo(static_cast<unsigned int>(value)); |
| 2657 } | 2657 } |
| 2658 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getTexParameter", "i
nvalid parameter name, EXT_texture_filter_anisotropic not enabled"); | 2658 synthesizeGLError(GL_INVALID_ENUM, "getTexParameter", "invalid parameter
name, EXT_texture_filter_anisotropic not enabled"); |
| 2659 return WebGLGetInfo(); | 2659 return WebGLGetInfo(); |
| 2660 default: | 2660 default: |
| 2661 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getTexParameter", "i
nvalid parameter name"); | 2661 synthesizeGLError(GL_INVALID_ENUM, "getTexParameter", "invalid parameter
name"); |
| 2662 return WebGLGetInfo(); | 2662 return WebGLGetInfo(); |
| 2663 } | 2663 } |
| 2664 } | 2664 } |
| 2665 | 2665 |
| 2666 WebGLGetInfo WebGLRenderingContext::getUniform(WebGLProgram* program, const WebG
LUniformLocation* uniformLocation) | 2666 WebGLGetInfo WebGLRenderingContext::getUniform(WebGLProgram* program, const WebG
LUniformLocation* uniformLocation) |
| 2667 { | 2667 { |
| 2668 if (isContextLost() || !validateWebGLObject("getUniform", program)) | 2668 if (isContextLost() || !validateWebGLObject("getUniform", program)) |
| 2669 return WebGLGetInfo(); | 2669 return WebGLGetInfo(); |
| 2670 if (!uniformLocation || uniformLocation->program() != program) { | 2670 if (!uniformLocation || uniformLocation->program() != program) { |
| 2671 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "getUniform", "n
o uniformlocation or not valid for this program"); | 2671 synthesizeGLError(GL_INVALID_OPERATION, "getUniform", "no uniformlocatio
n or not valid for this program"); |
| 2672 return WebGLGetInfo(); | 2672 return WebGLGetInfo(); |
| 2673 } | 2673 } |
| 2674 GC3Dint location = uniformLocation->location(); | 2674 GC3Dint location = uniformLocation->location(); |
| 2675 | 2675 |
| 2676 // FIXME: make this more efficient using WebGLUniformLocation and caching ty
pes in it | 2676 // FIXME: make this more efficient using WebGLUniformLocation and caching ty
pes in it |
| 2677 GC3Dint activeUniforms = 0; | 2677 GC3Dint activeUniforms = 0; |
| 2678 m_context->getProgramiv(objectOrZero(program), GraphicsContext3D::ACTIVE_UNI
FORMS, &activeUniforms); | 2678 m_context->getProgramiv(objectOrZero(program), GL_ACTIVE_UNIFORMS, &activeUn
iforms); |
| 2679 for (GC3Dint i = 0; i < activeUniforms; i++) { | 2679 for (GC3Dint i = 0; i < activeUniforms; i++) { |
| 2680 ActiveInfo info; | 2680 ActiveInfo info; |
| 2681 if (!m_context->getActiveUniform(objectOrZero(program), i, info)) | 2681 if (!m_context->getActiveUniform(objectOrZero(program), i, info)) |
| 2682 return WebGLGetInfo(); | 2682 return WebGLGetInfo(); |
| 2683 // Strip "[0]" from the name if it's an array. | 2683 // Strip "[0]" from the name if it's an array. |
| 2684 if (info.size > 1 && info.name.endsWith("[0]")) | 2684 if (info.size > 1 && info.name.endsWith("[0]")) |
| 2685 info.name = info.name.left(info.name.length() - 3); | 2685 info.name = info.name.left(info.name.length() - 3); |
| 2686 // If it's an array, we need to iterate through each element, appending
"[index]" to the name. | 2686 // If it's an array, we need to iterate through each element, appending
"[index]" to the name. |
| 2687 for (GC3Dint index = 0; index < info.size; ++index) { | 2687 for (GC3Dint index = 0; index < info.size; ++index) { |
| 2688 String name = info.name; | 2688 String name = info.name; |
| 2689 if (info.size > 1 && index >= 1) { | 2689 if (info.size > 1 && index >= 1) { |
| 2690 name.append('['); | 2690 name.append('['); |
| 2691 name.append(String::number(index)); | 2691 name.append(String::number(index)); |
| 2692 name.append(']'); | 2692 name.append(']'); |
| 2693 } | 2693 } |
| 2694 // Now need to look this up by name again to find its location | 2694 // Now need to look this up by name again to find its location |
| 2695 GC3Dint loc = m_context->getUniformLocation(objectOrZero(program), n
ame); | 2695 GC3Dint loc = m_context->getUniformLocation(objectOrZero(program), n
ame); |
| 2696 if (loc == location) { | 2696 if (loc == location) { |
| 2697 // Found it. Use the type in the ActiveInfo to determine the ret
urn type. | 2697 // Found it. Use the type in the ActiveInfo to determine the ret
urn type. |
| 2698 GC3Denum baseType; | 2698 GC3Denum baseType; |
| 2699 unsigned int length; | 2699 unsigned int length; |
| 2700 switch (info.type) { | 2700 switch (info.type) { |
| 2701 case GraphicsContext3D::BOOL: | 2701 case GL_BOOL: |
| 2702 baseType = GraphicsContext3D::BOOL; | 2702 baseType = GL_BOOL; |
| 2703 length = 1; | 2703 length = 1; |
| 2704 break; | 2704 break; |
| 2705 case GraphicsContext3D::BOOL_VEC2: | 2705 case GL_BOOL_VEC2: |
| 2706 baseType = GraphicsContext3D::BOOL; | 2706 baseType = GL_BOOL; |
| 2707 length = 2; | 2707 length = 2; |
| 2708 break; | 2708 break; |
| 2709 case GraphicsContext3D::BOOL_VEC3: | 2709 case GL_BOOL_VEC3: |
| 2710 baseType = GraphicsContext3D::BOOL; | 2710 baseType = GL_BOOL; |
| 2711 length = 3; | 2711 length = 3; |
| 2712 break; | 2712 break; |
| 2713 case GraphicsContext3D::BOOL_VEC4: | 2713 case GL_BOOL_VEC4: |
| 2714 baseType = GraphicsContext3D::BOOL; | 2714 baseType = GL_BOOL; |
| 2715 length = 4; | 2715 length = 4; |
| 2716 break; | 2716 break; |
| 2717 case GraphicsContext3D::INT: | 2717 case GL_INT: |
| 2718 baseType = GraphicsContext3D::INT; | 2718 baseType = GL_INT; |
| 2719 length = 1; | 2719 length = 1; |
| 2720 break; | 2720 break; |
| 2721 case GraphicsContext3D::INT_VEC2: | 2721 case GL_INT_VEC2: |
| 2722 baseType = GraphicsContext3D::INT; | 2722 baseType = GL_INT; |
| 2723 length = 2; | 2723 length = 2; |
| 2724 break; | 2724 break; |
| 2725 case GraphicsContext3D::INT_VEC3: | 2725 case GL_INT_VEC3: |
| 2726 baseType = GraphicsContext3D::INT; | 2726 baseType = GL_INT; |
| 2727 length = 3; | 2727 length = 3; |
| 2728 break; | 2728 break; |
| 2729 case GraphicsContext3D::INT_VEC4: | 2729 case GL_INT_VEC4: |
| 2730 baseType = GraphicsContext3D::INT; | 2730 baseType = GL_INT; |
| 2731 length = 4; | 2731 length = 4; |
| 2732 break; | 2732 break; |
| 2733 case GraphicsContext3D::FLOAT: | 2733 case GL_FLOAT: |
| 2734 baseType = GraphicsContext3D::FLOAT; | 2734 baseType = GL_FLOAT; |
| 2735 length = 1; | 2735 length = 1; |
| 2736 break; | 2736 break; |
| 2737 case GraphicsContext3D::FLOAT_VEC2: | 2737 case GL_FLOAT_VEC2: |
| 2738 baseType = GraphicsContext3D::FLOAT; | 2738 baseType = GL_FLOAT; |
| 2739 length = 2; | 2739 length = 2; |
| 2740 break; | 2740 break; |
| 2741 case GraphicsContext3D::FLOAT_VEC3: | 2741 case GL_FLOAT_VEC3: |
| 2742 baseType = GraphicsContext3D::FLOAT; | 2742 baseType = GL_FLOAT; |
| 2743 length = 3; | 2743 length = 3; |
| 2744 break; | 2744 break; |
| 2745 case GraphicsContext3D::FLOAT_VEC4: | 2745 case GL_FLOAT_VEC4: |
| 2746 baseType = GraphicsContext3D::FLOAT; | 2746 baseType = GL_FLOAT; |
| 2747 length = 4; | 2747 length = 4; |
| 2748 break; | 2748 break; |
| 2749 case GraphicsContext3D::FLOAT_MAT2: | 2749 case GL_FLOAT_MAT2: |
| 2750 baseType = GraphicsContext3D::FLOAT; | 2750 baseType = GL_FLOAT; |
| 2751 length = 4; | 2751 length = 4; |
| 2752 break; | 2752 break; |
| 2753 case GraphicsContext3D::FLOAT_MAT3: | 2753 case GL_FLOAT_MAT3: |
| 2754 baseType = GraphicsContext3D::FLOAT; | 2754 baseType = GL_FLOAT; |
| 2755 length = 9; | 2755 length = 9; |
| 2756 break; | 2756 break; |
| 2757 case GraphicsContext3D::FLOAT_MAT4: | 2757 case GL_FLOAT_MAT4: |
| 2758 baseType = GraphicsContext3D::FLOAT; | 2758 baseType = GL_FLOAT; |
| 2759 length = 16; | 2759 length = 16; |
| 2760 break; | 2760 break; |
| 2761 case GraphicsContext3D::SAMPLER_2D: | 2761 case GL_SAMPLER_2D: |
| 2762 case GraphicsContext3D::SAMPLER_CUBE: | 2762 case GL_SAMPLER_CUBE: |
| 2763 baseType = GraphicsContext3D::INT; | 2763 baseType = GL_INT; |
| 2764 length = 1; | 2764 length = 1; |
| 2765 break; | 2765 break; |
| 2766 default: | 2766 default: |
| 2767 // Can't handle this type | 2767 // Can't handle this type |
| 2768 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "getUnif
orm", "unhandled type"); | 2768 synthesizeGLError(GL_INVALID_VALUE, "getUniform", "unhandled
type"); |
| 2769 return WebGLGetInfo(); | 2769 return WebGLGetInfo(); |
| 2770 } | 2770 } |
| 2771 switch (baseType) { | 2771 switch (baseType) { |
| 2772 case GraphicsContext3D::FLOAT: { | 2772 case GL_FLOAT: { |
| 2773 GC3Dfloat value[16] = {0}; | 2773 GC3Dfloat value[16] = {0}; |
| 2774 m_context->getUniformfv(objectOrZero(program), location, val
ue); | 2774 m_context->getUniformfv(objectOrZero(program), location, val
ue); |
| 2775 if (length == 1) | 2775 if (length == 1) |
| 2776 return WebGLGetInfo(value[0]); | 2776 return WebGLGetInfo(value[0]); |
| 2777 return WebGLGetInfo(Float32Array::create(value, length)); | 2777 return WebGLGetInfo(Float32Array::create(value, length)); |
| 2778 } | 2778 } |
| 2779 case GraphicsContext3D::INT: { | 2779 case GL_INT: { |
| 2780 GC3Dint value[4] = {0}; | 2780 GC3Dint value[4] = {0}; |
| 2781 m_context->getUniformiv(objectOrZero(program), location, val
ue); | 2781 m_context->getUniformiv(objectOrZero(program), location, val
ue); |
| 2782 if (length == 1) | 2782 if (length == 1) |
| 2783 return WebGLGetInfo(value[0]); | 2783 return WebGLGetInfo(value[0]); |
| 2784 return WebGLGetInfo(Int32Array::create(value, length)); | 2784 return WebGLGetInfo(Int32Array::create(value, length)); |
| 2785 } | 2785 } |
| 2786 case GraphicsContext3D::BOOL: { | 2786 case GL_BOOL: { |
| 2787 GC3Dint value[4] = {0}; | 2787 GC3Dint value[4] = {0}; |
| 2788 m_context->getUniformiv(objectOrZero(program), location, val
ue); | 2788 m_context->getUniformiv(objectOrZero(program), location, val
ue); |
| 2789 if (length > 1) { | 2789 if (length > 1) { |
| 2790 bool boolValue[16] = {0}; | 2790 bool boolValue[16] = {0}; |
| 2791 for (unsigned j = 0; j < length; j++) | 2791 for (unsigned j = 0; j < length; j++) |
| 2792 boolValue[j] = static_cast<bool>(value[j]); | 2792 boolValue[j] = static_cast<bool>(value[j]); |
| 2793 return WebGLGetInfo(boolValue, length); | 2793 return WebGLGetInfo(boolValue, length); |
| 2794 } | 2794 } |
| 2795 return WebGLGetInfo(static_cast<bool>(value[0])); | 2795 return WebGLGetInfo(static_cast<bool>(value[0])); |
| 2796 } | 2796 } |
| 2797 default: | 2797 default: |
| 2798 notImplemented(); | 2798 notImplemented(); |
| 2799 } | 2799 } |
| 2800 } | 2800 } |
| 2801 } | 2801 } |
| 2802 } | 2802 } |
| 2803 // If we get here, something went wrong in our unfortunately complex logic a
bove | 2803 // If we get here, something went wrong in our unfortunately complex logic a
bove |
| 2804 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "getUniform", "unknown e
rror"); | 2804 synthesizeGLError(GL_INVALID_VALUE, "getUniform", "unknown error"); |
| 2805 return WebGLGetInfo(); | 2805 return WebGLGetInfo(); |
| 2806 } | 2806 } |
| 2807 | 2807 |
| 2808 PassRefPtr<WebGLUniformLocation> WebGLRenderingContext::getUniformLocation(WebGL
Program* program, const String& name) | 2808 PassRefPtr<WebGLUniformLocation> WebGLRenderingContext::getUniformLocation(WebGL
Program* program, const String& name) |
| 2809 { | 2809 { |
| 2810 if (isContextLost() || !validateWebGLObject("getUniformLocation", program)) | 2810 if (isContextLost() || !validateWebGLObject("getUniformLocation", program)) |
| 2811 return 0; | 2811 return 0; |
| 2812 if (!validateLocationLength("getUniformLocation", name)) | 2812 if (!validateLocationLength("getUniformLocation", name)) |
| 2813 return 0; | 2813 return 0; |
| 2814 if (!validateString("getUniformLocation", name)) | 2814 if (!validateString("getUniformLocation", name)) |
| 2815 return 0; | 2815 return 0; |
| 2816 if (isPrefixReserved(name)) | 2816 if (isPrefixReserved(name)) |
| 2817 return 0; | 2817 return 0; |
| 2818 if (!program->linkStatus()) { | 2818 if (!program->linkStatus()) { |
| 2819 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "getUniformLocat
ion", "program not linked"); | 2819 synthesizeGLError(GL_INVALID_OPERATION, "getUniformLocation", "program n
ot linked"); |
| 2820 return 0; | 2820 return 0; |
| 2821 } | 2821 } |
| 2822 GC3Dint uniformLocation = m_context->getUniformLocation(objectOrZero(program
), name); | 2822 GC3Dint uniformLocation = m_context->getUniformLocation(objectOrZero(program
), name); |
| 2823 if (uniformLocation == -1) | 2823 if (uniformLocation == -1) |
| 2824 return 0; | 2824 return 0; |
| 2825 return WebGLUniformLocation::create(program, uniformLocation); | 2825 return WebGLUniformLocation::create(program, uniformLocation); |
| 2826 } | 2826 } |
| 2827 | 2827 |
| 2828 WebGLGetInfo WebGLRenderingContext::getVertexAttrib(GC3Duint index, GC3Denum pna
me) | 2828 WebGLGetInfo WebGLRenderingContext::getVertexAttrib(GC3Duint index, GC3Denum pna
me) |
| 2829 { | 2829 { |
| 2830 if (isContextLost()) | 2830 if (isContextLost()) |
| 2831 return WebGLGetInfo(); | 2831 return WebGLGetInfo(); |
| 2832 if (index >= m_maxVertexAttribs) { | 2832 if (index >= m_maxVertexAttribs) { |
| 2833 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "getVertexAttrib", "
index out of range"); | 2833 synthesizeGLError(GL_INVALID_VALUE, "getVertexAttrib", "index out of ran
ge"); |
| 2834 return WebGLGetInfo(); | 2834 return WebGLGetInfo(); |
| 2835 } | 2835 } |
| 2836 const WebGLVertexArrayObjectOES::VertexAttribState& state = m_boundVertexArr
ayObject->getVertexAttribState(index); | 2836 const WebGLVertexArrayObjectOES::VertexAttribState& state = m_boundVertexArr
ayObject->getVertexAttribState(index); |
| 2837 | 2837 |
| 2838 if (m_angleInstancedArrays && pname == Extensions3D::VERTEX_ATTRIB_ARRAY_DIV
ISOR_ANGLE) | 2838 if (m_angleInstancedArrays && pname == Extensions3D::VERTEX_ATTRIB_ARRAY_DIV
ISOR_ANGLE) |
| 2839 return WebGLGetInfo(state.divisor); | 2839 return WebGLGetInfo(state.divisor); |
| 2840 | 2840 |
| 2841 switch (pname) { | 2841 switch (pname) { |
| 2842 case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: | 2842 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: |
| 2843 if (!state.bufferBinding || !state.bufferBinding->object()) | 2843 if (!state.bufferBinding || !state.bufferBinding->object()) |
| 2844 return WebGLGetInfo(); | 2844 return WebGLGetInfo(); |
| 2845 return WebGLGetInfo(PassRefPtr<WebGLBuffer>(state.bufferBinding)); | 2845 return WebGLGetInfo(PassRefPtr<WebGLBuffer>(state.bufferBinding)); |
| 2846 case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_ENABLED: | 2846 case GL_VERTEX_ATTRIB_ARRAY_ENABLED: |
| 2847 return WebGLGetInfo(state.enabled); | 2847 return WebGLGetInfo(state.enabled); |
| 2848 case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_NORMALIZED: | 2848 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED: |
| 2849 return WebGLGetInfo(state.normalized); | 2849 return WebGLGetInfo(state.normalized); |
| 2850 case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_SIZE: | 2850 case GL_VERTEX_ATTRIB_ARRAY_SIZE: |
| 2851 return WebGLGetInfo(state.size); | 2851 return WebGLGetInfo(state.size); |
| 2852 case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_STRIDE: | 2852 case GL_VERTEX_ATTRIB_ARRAY_STRIDE: |
| 2853 return WebGLGetInfo(state.originalStride); | 2853 return WebGLGetInfo(state.originalStride); |
| 2854 case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_TYPE: | 2854 case GL_VERTEX_ATTRIB_ARRAY_TYPE: |
| 2855 return WebGLGetInfo(state.type); | 2855 return WebGLGetInfo(state.type); |
| 2856 case GraphicsContext3D::CURRENT_VERTEX_ATTRIB: | 2856 case GL_CURRENT_VERTEX_ATTRIB: |
| 2857 return WebGLGetInfo(Float32Array::create(m_vertexAttribValue[index].valu
e, 4)); | 2857 return WebGLGetInfo(Float32Array::create(m_vertexAttribValue[index].valu
e, 4)); |
| 2858 default: | 2858 default: |
| 2859 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getVertexAttrib", "i
nvalid parameter name"); | 2859 synthesizeGLError(GL_INVALID_ENUM, "getVertexAttrib", "invalid parameter
name"); |
| 2860 return WebGLGetInfo(); | 2860 return WebGLGetInfo(); |
| 2861 } | 2861 } |
| 2862 } | 2862 } |
| 2863 | 2863 |
| 2864 long long WebGLRenderingContext::getVertexAttribOffset(GC3Duint index, GC3Denum
pname) | 2864 long long WebGLRenderingContext::getVertexAttribOffset(GC3Duint index, GC3Denum
pname) |
| 2865 { | 2865 { |
| 2866 if (isContextLost()) | 2866 if (isContextLost()) |
| 2867 return 0; | 2867 return 0; |
| 2868 if (pname != GraphicsContext3D::VERTEX_ATTRIB_ARRAY_POINTER) { | 2868 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER) { |
| 2869 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "getVertexAttribOffse
t", "invalid parameter name"); | 2869 synthesizeGLError(GL_INVALID_ENUM, "getVertexAttribOffset", "invalid par
ameter name"); |
| 2870 return 0; | 2870 return 0; |
| 2871 } | 2871 } |
| 2872 GC3Dsizeiptr result = m_context->getVertexAttribOffset(index, pname); | 2872 GC3Dsizeiptr result = m_context->getVertexAttribOffset(index, pname); |
| 2873 return static_cast<long long>(result); | 2873 return static_cast<long long>(result); |
| 2874 } | 2874 } |
| 2875 | 2875 |
| 2876 void WebGLRenderingContext::hint(GC3Denum target, GC3Denum mode) | 2876 void WebGLRenderingContext::hint(GC3Denum target, GC3Denum mode) |
| 2877 { | 2877 { |
| 2878 if (isContextLost()) | 2878 if (isContextLost()) |
| 2879 return; | 2879 return; |
| 2880 bool isValid = false; | 2880 bool isValid = false; |
| 2881 switch (target) { | 2881 switch (target) { |
| 2882 case GraphicsContext3D::GENERATE_MIPMAP_HINT: | 2882 case GL_GENERATE_MIPMAP_HINT: |
| 2883 isValid = true; | 2883 isValid = true; |
| 2884 break; | 2884 break; |
| 2885 case Extensions3D::FRAGMENT_SHADER_DERIVATIVE_HINT_OES: // OES_standard_deri
vatives | 2885 case Extensions3D::FRAGMENT_SHADER_DERIVATIVE_HINT_OES: // OES_standard_deri
vatives |
| 2886 if (m_oesStandardDerivatives) | 2886 if (m_oesStandardDerivatives) |
| 2887 isValid = true; | 2887 isValid = true; |
| 2888 break; | 2888 break; |
| 2889 } | 2889 } |
| 2890 if (!isValid) { | 2890 if (!isValid) { |
| 2891 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "hint", "invalid targ
et"); | 2891 synthesizeGLError(GL_INVALID_ENUM, "hint", "invalid target"); |
| 2892 return; | 2892 return; |
| 2893 } | 2893 } |
| 2894 m_context->hint(target, mode); | 2894 m_context->hint(target, mode); |
| 2895 } | 2895 } |
| 2896 | 2896 |
| 2897 GC3Dboolean WebGLRenderingContext::isBuffer(WebGLBuffer* buffer) | 2897 GC3Dboolean WebGLRenderingContext::isBuffer(WebGLBuffer* buffer) |
| 2898 { | 2898 { |
| 2899 if (!buffer || isContextLost()) | 2899 if (!buffer || isContextLost()) |
| 2900 return 0; | 2900 return 0; |
| 2901 | 2901 |
| 2902 if (!buffer->hasEverBeenBound()) | 2902 if (!buffer->hasEverBeenBound()) |
| 2903 return 0; | 2903 return 0; |
| 2904 | 2904 |
| 2905 return m_context->isBuffer(buffer->object()); | 2905 return m_context->isBuffer(buffer->object()); |
| 2906 } | 2906 } |
| 2907 | 2907 |
| 2908 bool WebGLRenderingContext::isContextLost() | 2908 bool WebGLRenderingContext::isContextLost() |
| 2909 { | 2909 { |
| 2910 return m_contextLost; | 2910 return m_contextLost; |
| 2911 } | 2911 } |
| 2912 | 2912 |
| 2913 GC3Dboolean WebGLRenderingContext::isEnabled(GC3Denum cap) | 2913 GC3Dboolean WebGLRenderingContext::isEnabled(GC3Denum cap) |
| 2914 { | 2914 { |
| 2915 if (isContextLost() || !validateCapability("isEnabled", cap)) | 2915 if (isContextLost() || !validateCapability("isEnabled", cap)) |
| 2916 return 0; | 2916 return 0; |
| 2917 if (cap == GraphicsContext3D::STENCIL_TEST) | 2917 if (cap == GL_STENCIL_TEST) |
| 2918 return m_stencilEnabled; | 2918 return m_stencilEnabled; |
| 2919 return m_context->isEnabled(cap); | 2919 return m_context->isEnabled(cap); |
| 2920 } | 2920 } |
| 2921 | 2921 |
| 2922 GC3Dboolean WebGLRenderingContext::isFramebuffer(WebGLFramebuffer* framebuffer) | 2922 GC3Dboolean WebGLRenderingContext::isFramebuffer(WebGLFramebuffer* framebuffer) |
| 2923 { | 2923 { |
| 2924 if (!framebuffer || isContextLost()) | 2924 if (!framebuffer || isContextLost()) |
| 2925 return 0; | 2925 return 0; |
| 2926 | 2926 |
| 2927 if (!framebuffer->hasEverBeenBound()) | 2927 if (!framebuffer->hasEverBeenBound()) |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2982 | 2982 |
| 2983 m_context->linkProgram(objectOrZero(program)); | 2983 m_context->linkProgram(objectOrZero(program)); |
| 2984 program->increaseLinkCount(); | 2984 program->increaseLinkCount(); |
| 2985 } | 2985 } |
| 2986 | 2986 |
| 2987 void WebGLRenderingContext::pixelStorei(GC3Denum pname, GC3Dint param) | 2987 void WebGLRenderingContext::pixelStorei(GC3Denum pname, GC3Dint param) |
| 2988 { | 2988 { |
| 2989 if (isContextLost()) | 2989 if (isContextLost()) |
| 2990 return; | 2990 return; |
| 2991 switch (pname) { | 2991 switch (pname) { |
| 2992 case GraphicsContext3D::UNPACK_FLIP_Y_WEBGL: | 2992 case GC3D_UNPACK_FLIP_Y_WEBGL: |
| 2993 m_unpackFlipY = param; | 2993 m_unpackFlipY = param; |
| 2994 break; | 2994 break; |
| 2995 case GraphicsContext3D::UNPACK_PREMULTIPLY_ALPHA_WEBGL: | 2995 case GC3D_UNPACK_PREMULTIPLY_ALPHA_WEBGL: |
| 2996 m_unpackPremultiplyAlpha = param; | 2996 m_unpackPremultiplyAlpha = param; |
| 2997 break; | 2997 break; |
| 2998 case GraphicsContext3D::UNPACK_COLORSPACE_CONVERSION_WEBGL: | 2998 case GC3D_UNPACK_COLORSPACE_CONVERSION_WEBGL: |
| 2999 if (param == GraphicsContext3D::BROWSER_DEFAULT_WEBGL || param == Graphi
csContext3D::NONE) | 2999 if (param == GC3D_BROWSER_DEFAULT_WEBGL || param == GL_NONE) |
| 3000 m_unpackColorspaceConversion = static_cast<GC3Denum>(param); | 3000 m_unpackColorspaceConversion = static_cast<GC3Denum>(param); |
| 3001 else { | 3001 else { |
| 3002 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "pixelStorei", "
invalid parameter for UNPACK_COLORSPACE_CONVERSION_WEBGL"); | 3002 synthesizeGLError(GL_INVALID_VALUE, "pixelStorei", "invalid paramete
r for UNPACK_COLORSPACE_CONVERSION_WEBGL"); |
| 3003 return; | 3003 return; |
| 3004 } | 3004 } |
| 3005 break; | 3005 break; |
| 3006 case GraphicsContext3D::PACK_ALIGNMENT: | 3006 case GL_PACK_ALIGNMENT: |
| 3007 case GraphicsContext3D::UNPACK_ALIGNMENT: | 3007 case GL_UNPACK_ALIGNMENT: |
| 3008 if (param == 1 || param == 2 || param == 4 || param == 8) { | 3008 if (param == 1 || param == 2 || param == 4 || param == 8) { |
| 3009 if (pname == GraphicsContext3D::PACK_ALIGNMENT) | 3009 if (pname == GL_PACK_ALIGNMENT) |
| 3010 m_packAlignment = param; | 3010 m_packAlignment = param; |
| 3011 else // GraphicsContext3D::UNPACK_ALIGNMENT: | 3011 else // GL_UNPACK_ALIGNMENT: |
| 3012 m_unpackAlignment = param; | 3012 m_unpackAlignment = param; |
| 3013 m_context->pixelStorei(pname, param); | 3013 m_context->pixelStorei(pname, param); |
| 3014 } else { | 3014 } else { |
| 3015 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "pixelStorei", "
invalid parameter for alignment"); | 3015 synthesizeGLError(GL_INVALID_VALUE, "pixelStorei", "invalid paramete
r for alignment"); |
| 3016 return; | 3016 return; |
| 3017 } | 3017 } |
| 3018 break; | 3018 break; |
| 3019 default: | 3019 default: |
| 3020 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "pixelStorei", "inval
id parameter name"); | 3020 synthesizeGLError(GL_INVALID_ENUM, "pixelStorei", "invalid parameter nam
e"); |
| 3021 return; | 3021 return; |
| 3022 } | 3022 } |
| 3023 } | 3023 } |
| 3024 | 3024 |
| 3025 void WebGLRenderingContext::polygonOffset(GC3Dfloat factor, GC3Dfloat units) | 3025 void WebGLRenderingContext::polygonOffset(GC3Dfloat factor, GC3Dfloat units) |
| 3026 { | 3026 { |
| 3027 if (isContextLost()) | 3027 if (isContextLost()) |
| 3028 return; | 3028 return; |
| 3029 m_context->polygonOffset(factor, units); | 3029 m_context->polygonOffset(factor, units); |
| 3030 } | 3030 } |
| 3031 | 3031 |
| 3032 void WebGLRenderingContext::readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC
3Dsizei height, GC3Denum format, GC3Denum type, ArrayBufferView* pixels) | 3032 void WebGLRenderingContext::readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC
3Dsizei height, GC3Denum format, GC3Denum type, ArrayBufferView* pixels) |
| 3033 { | 3033 { |
| 3034 if (isContextLost()) | 3034 if (isContextLost()) |
| 3035 return; | 3035 return; |
| 3036 // Due to WebGL's same-origin restrictions, it is not possible to | 3036 // Due to WebGL's same-origin restrictions, it is not possible to |
| 3037 // taint the origin using the WebGL API. | 3037 // taint the origin using the WebGL API. |
| 3038 ASSERT(canvas()->originClean()); | 3038 ASSERT(canvas()->originClean()); |
| 3039 // Validate input parameters. | 3039 // Validate input parameters. |
| 3040 if (!pixels) { | 3040 if (!pixels) { |
| 3041 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "readPixels", "no de
stination ArrayBufferView"); | 3041 synthesizeGLError(GL_INVALID_VALUE, "readPixels", "no destination ArrayB
ufferView"); |
| 3042 return; | 3042 return; |
| 3043 } | 3043 } |
| 3044 switch (format) { | 3044 switch (format) { |
| 3045 case GraphicsContext3D::ALPHA: | 3045 case GL_ALPHA: |
| 3046 case GraphicsContext3D::RGB: | 3046 case GL_RGB: |
| 3047 case GraphicsContext3D::RGBA: | 3047 case GL_RGBA: |
| 3048 break; | 3048 break; |
| 3049 default: | 3049 default: |
| 3050 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "readPixels", "invali
d format"); | 3050 synthesizeGLError(GL_INVALID_ENUM, "readPixels", "invalid format"); |
| 3051 return; | 3051 return; |
| 3052 } | 3052 } |
| 3053 switch (type) { | 3053 switch (type) { |
| 3054 case GraphicsContext3D::UNSIGNED_BYTE: | 3054 case GL_UNSIGNED_BYTE: |
| 3055 case GraphicsContext3D::UNSIGNED_SHORT_5_6_5: | 3055 case GL_UNSIGNED_SHORT_5_6_5: |
| 3056 case GraphicsContext3D::UNSIGNED_SHORT_4_4_4_4: | 3056 case GL_UNSIGNED_SHORT_4_4_4_4: |
| 3057 case GraphicsContext3D::UNSIGNED_SHORT_5_5_5_1: | 3057 case GL_UNSIGNED_SHORT_5_5_5_1: |
| 3058 break; | 3058 break; |
| 3059 default: | 3059 default: |
| 3060 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "readPixels", "invali
d type"); | 3060 synthesizeGLError(GL_INVALID_ENUM, "readPixels", "invalid type"); |
| 3061 return; | 3061 return; |
| 3062 } | 3062 } |
| 3063 if (format != GraphicsContext3D::RGBA || type != GraphicsContext3D::UNSIGNED
_BYTE) { | 3063 if (format != GL_RGBA || type != GL_UNSIGNED_BYTE) { |
| 3064 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "readPixels", "f
ormat not RGBA or type not UNSIGNED_BYTE"); | 3064 synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "format not RGBA o
r type not UNSIGNED_BYTE"); |
| 3065 return; | 3065 return; |
| 3066 } | 3066 } |
| 3067 // Validate array type against pixel type. | 3067 // Validate array type against pixel type. |
| 3068 if (pixels->getType() != ArrayBufferView::TypeUint8) { | 3068 if (pixels->getType() != ArrayBufferView::TypeUint8) { |
| 3069 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "readPixels", "A
rrayBufferView not Uint8Array"); | 3069 synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "ArrayBufferView n
ot Uint8Array"); |
| 3070 return; | 3070 return; |
| 3071 } | 3071 } |
| 3072 const char* reason = "framebuffer incomplete"; | 3072 const char* reason = "framebuffer incomplete"; |
| 3073 if (m_framebufferBinding && !m_framebufferBinding->onAccess(graphicsContext3
D(), &reason)) { | 3073 if (m_framebufferBinding && !m_framebufferBinding->onAccess(graphicsContext3
D(), &reason)) { |
| 3074 synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, "rea
dPixels", reason); | 3074 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "readPixels", reason
); |
| 3075 return; | 3075 return; |
| 3076 } | 3076 } |
| 3077 // Calculate array size, taking into consideration of PACK_ALIGNMENT. | 3077 // Calculate array size, taking into consideration of PACK_ALIGNMENT. |
| 3078 unsigned int totalBytesRequired = 0; | 3078 unsigned int totalBytesRequired = 0; |
| 3079 unsigned int padding = 0; | 3079 unsigned int padding = 0; |
| 3080 GC3Denum error = m_context->computeImageSizeInBytes(format, type, width, hei
ght, m_packAlignment, &totalBytesRequired, &padding); | 3080 GC3Denum error = m_context->computeImageSizeInBytes(format, type, width, hei
ght, m_packAlignment, &totalBytesRequired, &padding); |
| 3081 if (error != GraphicsContext3D::NO_ERROR) { | 3081 if (error != GL_NO_ERROR) { |
| 3082 synthesizeGLError(error, "readPixels", "invalid dimensions"); | 3082 synthesizeGLError(error, "readPixels", "invalid dimensions"); |
| 3083 return; | 3083 return; |
| 3084 } | 3084 } |
| 3085 if (pixels->byteLength() < totalBytesRequired) { | 3085 if (pixels->byteLength() < totalBytesRequired) { |
| 3086 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "readPixels", "A
rrayBufferView not large enough for dimensions"); | 3086 synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "ArrayBufferView n
ot large enough for dimensions"); |
| 3087 return; | 3087 return; |
| 3088 } | 3088 } |
| 3089 | 3089 |
| 3090 clearIfComposited(); | 3090 clearIfComposited(); |
| 3091 void* data = pixels->baseAddress(); | 3091 void* data = pixels->baseAddress(); |
| 3092 | 3092 |
| 3093 { | 3093 { |
| 3094 ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBin
ding.get()); | 3094 ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBin
ding.get()); |
| 3095 m_context->readPixels(x, y, width, height, format, type, data); | 3095 m_context->readPixels(x, y, width, height, format, type, data); |
| 3096 } | 3096 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3108 pixels += padding; | 3108 pixels += padding; |
| 3109 } | 3109 } |
| 3110 } | 3110 } |
| 3111 #endif | 3111 #endif |
| 3112 } | 3112 } |
| 3113 | 3113 |
| 3114 void WebGLRenderingContext::renderbufferStorage(GC3Denum target, GC3Denum intern
alformat, GC3Dsizei width, GC3Dsizei height) | 3114 void WebGLRenderingContext::renderbufferStorage(GC3Denum target, GC3Denum intern
alformat, GC3Dsizei width, GC3Dsizei height) |
| 3115 { | 3115 { |
| 3116 if (isContextLost()) | 3116 if (isContextLost()) |
| 3117 return; | 3117 return; |
| 3118 if (target != GraphicsContext3D::RENDERBUFFER) { | 3118 if (target != GL_RENDERBUFFER) { |
| 3119 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "renderbufferStorage"
, "invalid target"); | 3119 synthesizeGLError(GL_INVALID_ENUM, "renderbufferStorage", "invalid targe
t"); |
| 3120 return; | 3120 return; |
| 3121 } | 3121 } |
| 3122 if (!m_renderbufferBinding || !m_renderbufferBinding->object()) { | 3122 if (!m_renderbufferBinding || !m_renderbufferBinding->object()) { |
| 3123 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "renderbufferSto
rage", "no bound renderbuffer"); | 3123 synthesizeGLError(GL_INVALID_OPERATION, "renderbufferStorage", "no bound
renderbuffer"); |
| 3124 return; | 3124 return; |
| 3125 } | 3125 } |
| 3126 if (!validateSize("renderbufferStorage", width, height)) | 3126 if (!validateSize("renderbufferStorage", width, height)) |
| 3127 return; | 3127 return; |
| 3128 switch (internalformat) { | 3128 switch (internalformat) { |
| 3129 case GraphicsContext3D::DEPTH_COMPONENT16: | 3129 case GL_DEPTH_COMPONENT16: |
| 3130 case GraphicsContext3D::RGBA4: | 3130 case GL_RGBA4: |
| 3131 case GraphicsContext3D::RGB5_A1: | 3131 case GL_RGB5_A1: |
| 3132 case GraphicsContext3D::RGB565: | 3132 case GL_RGB565: |
| 3133 case GraphicsContext3D::STENCIL_INDEX8: | 3133 case GL_STENCIL_INDEX8: |
| 3134 m_context->renderbufferStorage(target, internalformat, width, height); | 3134 m_context->renderbufferStorage(target, internalformat, width, height); |
| 3135 m_renderbufferBinding->setInternalFormat(internalformat); | 3135 m_renderbufferBinding->setInternalFormat(internalformat); |
| 3136 m_renderbufferBinding->setSize(width, height); | 3136 m_renderbufferBinding->setSize(width, height); |
| 3137 m_renderbufferBinding->deleteEmulatedStencilBuffer(m_context.get()); | 3137 m_renderbufferBinding->deleteEmulatedStencilBuffer(m_context.get()); |
| 3138 break; | 3138 break; |
| 3139 case GraphicsContext3D::DEPTH_STENCIL: | 3139 case GL_DEPTH_STENCIL_OES: |
| 3140 if (isDepthStencilSupported()) { | 3140 if (isDepthStencilSupported()) { |
| 3141 m_context->renderbufferStorage(target, Extensions3D::DEPTH24_STENCIL
8, width, height); | 3141 m_context->renderbufferStorage(target, Extensions3D::DEPTH24_STENCIL
8, width, height); |
| 3142 } else { | 3142 } else { |
| 3143 WebGLRenderbuffer* emulatedStencilBuffer = ensureEmulatedStencilBuff
er(target, m_renderbufferBinding.get()); | 3143 WebGLRenderbuffer* emulatedStencilBuffer = ensureEmulatedStencilBuff
er(target, m_renderbufferBinding.get()); |
| 3144 if (!emulatedStencilBuffer) { | 3144 if (!emulatedStencilBuffer) { |
| 3145 synthesizeGLError(GraphicsContext3D::OUT_OF_MEMORY, "renderbuffe
rStorage", "out of memory"); | 3145 synthesizeGLError(GL_OUT_OF_MEMORY, "renderbufferStorage", "out
of memory"); |
| 3146 return; | 3146 return; |
| 3147 } | 3147 } |
| 3148 m_context->renderbufferStorage(target, GraphicsContext3D::DEPTH_COMP
ONENT16, width, height); | 3148 m_context->renderbufferStorage(target, GL_DEPTH_COMPONENT16, width,
height); |
| 3149 m_context->bindRenderbuffer(target, objectOrZero(emulatedStencilBuff
er)); | 3149 m_context->bindRenderbuffer(target, objectOrZero(emulatedStencilBuff
er)); |
| 3150 m_context->renderbufferStorage(target, GraphicsContext3D::STENCIL_IN
DEX8, width, height); | 3150 m_context->renderbufferStorage(target, GL_STENCIL_INDEX8, width, hei
ght); |
| 3151 m_context->bindRenderbuffer(target, objectOrZero(m_renderbufferBindi
ng.get())); | 3151 m_context->bindRenderbuffer(target, objectOrZero(m_renderbufferBindi
ng.get())); |
| 3152 emulatedStencilBuffer->setSize(width, height); | 3152 emulatedStencilBuffer->setSize(width, height); |
| 3153 emulatedStencilBuffer->setInternalFormat(GraphicsContext3D::STENCIL_
INDEX8); | 3153 emulatedStencilBuffer->setInternalFormat(GL_STENCIL_INDEX8); |
| 3154 } | 3154 } |
| 3155 m_renderbufferBinding->setSize(width, height); | 3155 m_renderbufferBinding->setSize(width, height); |
| 3156 m_renderbufferBinding->setInternalFormat(internalformat); | 3156 m_renderbufferBinding->setInternalFormat(internalformat); |
| 3157 break; | 3157 break; |
| 3158 default: | 3158 default: |
| 3159 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "renderbufferStorage"
, "invalid internalformat"); | 3159 synthesizeGLError(GL_INVALID_ENUM, "renderbufferStorage", "invalid inter
nalformat"); |
| 3160 return; | 3160 return; |
| 3161 } | 3161 } |
| 3162 applyStencilTest(); | 3162 applyStencilTest(); |
| 3163 } | 3163 } |
| 3164 | 3164 |
| 3165 void WebGLRenderingContext::sampleCoverage(GC3Dfloat value, GC3Dboolean invert) | 3165 void WebGLRenderingContext::sampleCoverage(GC3Dfloat value, GC3Dboolean invert) |
| 3166 { | 3166 { |
| 3167 if (isContextLost()) | 3167 if (isContextLost()) |
| 3168 return; | 3168 return; |
| 3169 m_context->sampleCoverage(value, invert); | 3169 m_context->sampleCoverage(value, invert); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3202 m_context->stencilFunc(func, ref, mask); | 3202 m_context->stencilFunc(func, ref, mask); |
| 3203 } | 3203 } |
| 3204 | 3204 |
| 3205 void WebGLRenderingContext::stencilFuncSeparate(GC3Denum face, GC3Denum func, GC
3Dint ref, GC3Duint mask) | 3205 void WebGLRenderingContext::stencilFuncSeparate(GC3Denum face, GC3Denum func, GC
3Dint ref, GC3Duint mask) |
| 3206 { | 3206 { |
| 3207 if (isContextLost()) | 3207 if (isContextLost()) |
| 3208 return; | 3208 return; |
| 3209 if (!validateStencilOrDepthFunc("stencilFuncSeparate", func)) | 3209 if (!validateStencilOrDepthFunc("stencilFuncSeparate", func)) |
| 3210 return; | 3210 return; |
| 3211 switch (face) { | 3211 switch (face) { |
| 3212 case GraphicsContext3D::FRONT_AND_BACK: | 3212 case GL_FRONT_AND_BACK: |
| 3213 m_stencilFuncRef = ref; | 3213 m_stencilFuncRef = ref; |
| 3214 m_stencilFuncRefBack = ref; | 3214 m_stencilFuncRefBack = ref; |
| 3215 m_stencilFuncMask = mask; | 3215 m_stencilFuncMask = mask; |
| 3216 m_stencilFuncMaskBack = mask; | 3216 m_stencilFuncMaskBack = mask; |
| 3217 break; | 3217 break; |
| 3218 case GraphicsContext3D::FRONT: | 3218 case GL_FRONT: |
| 3219 m_stencilFuncRef = ref; | 3219 m_stencilFuncRef = ref; |
| 3220 m_stencilFuncMask = mask; | 3220 m_stencilFuncMask = mask; |
| 3221 break; | 3221 break; |
| 3222 case GraphicsContext3D::BACK: | 3222 case GL_BACK: |
| 3223 m_stencilFuncRefBack = ref; | 3223 m_stencilFuncRefBack = ref; |
| 3224 m_stencilFuncMaskBack = mask; | 3224 m_stencilFuncMaskBack = mask; |
| 3225 break; | 3225 break; |
| 3226 default: | 3226 default: |
| 3227 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "stencilFuncSeparate"
, "invalid face"); | 3227 synthesizeGLError(GL_INVALID_ENUM, "stencilFuncSeparate", "invalid face"
); |
| 3228 return; | 3228 return; |
| 3229 } | 3229 } |
| 3230 m_context->stencilFuncSeparate(face, func, ref, mask); | 3230 m_context->stencilFuncSeparate(face, func, ref, mask); |
| 3231 } | 3231 } |
| 3232 | 3232 |
| 3233 void WebGLRenderingContext::stencilMask(GC3Duint mask) | 3233 void WebGLRenderingContext::stencilMask(GC3Duint mask) |
| 3234 { | 3234 { |
| 3235 if (isContextLost()) | 3235 if (isContextLost()) |
| 3236 return; | 3236 return; |
| 3237 m_stencilMask = mask; | 3237 m_stencilMask = mask; |
| 3238 m_stencilMaskBack = mask; | 3238 m_stencilMaskBack = mask; |
| 3239 m_context->stencilMask(mask); | 3239 m_context->stencilMask(mask); |
| 3240 } | 3240 } |
| 3241 | 3241 |
| 3242 void WebGLRenderingContext::stencilMaskSeparate(GC3Denum face, GC3Duint mask) | 3242 void WebGLRenderingContext::stencilMaskSeparate(GC3Denum face, GC3Duint mask) |
| 3243 { | 3243 { |
| 3244 if (isContextLost()) | 3244 if (isContextLost()) |
| 3245 return; | 3245 return; |
| 3246 switch (face) { | 3246 switch (face) { |
| 3247 case GraphicsContext3D::FRONT_AND_BACK: | 3247 case GL_FRONT_AND_BACK: |
| 3248 m_stencilMask = mask; | 3248 m_stencilMask = mask; |
| 3249 m_stencilMaskBack = mask; | 3249 m_stencilMaskBack = mask; |
| 3250 break; | 3250 break; |
| 3251 case GraphicsContext3D::FRONT: | 3251 case GL_FRONT: |
| 3252 m_stencilMask = mask; | 3252 m_stencilMask = mask; |
| 3253 break; | 3253 break; |
| 3254 case GraphicsContext3D::BACK: | 3254 case GL_BACK: |
| 3255 m_stencilMaskBack = mask; | 3255 m_stencilMaskBack = mask; |
| 3256 break; | 3256 break; |
| 3257 default: | 3257 default: |
| 3258 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "stencilMaskSeparate"
, "invalid face"); | 3258 synthesizeGLError(GL_INVALID_ENUM, "stencilMaskSeparate", "invalid face"
); |
| 3259 return; | 3259 return; |
| 3260 } | 3260 } |
| 3261 m_context->stencilMaskSeparate(face, mask); | 3261 m_context->stencilMaskSeparate(face, mask); |
| 3262 } | 3262 } |
| 3263 | 3263 |
| 3264 void WebGLRenderingContext::stencilOp(GC3Denum fail, GC3Denum zfail, GC3Denum zp
ass) | 3264 void WebGLRenderingContext::stencilOp(GC3Denum fail, GC3Denum zfail, GC3Denum zp
ass) |
| 3265 { | 3265 { |
| 3266 if (isContextLost()) | 3266 if (isContextLost()) |
| 3267 return; | 3267 return; |
| 3268 m_context->stencilOp(fail, zfail, zpass); | 3268 m_context->stencilOp(fail, zfail, zpass); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 3286 ASSERT(!pixels || validateSettableTexFormat("texImage2D", internalformat)); | 3286 ASSERT(!pixels || validateSettableTexFormat("texImage2D", internalformat)); |
| 3287 m_context->texImage2D(target, level, internalformat, width, height, | 3287 m_context->texImage2D(target, level, internalformat, width, height, |
| 3288 border, format, type, pixels); | 3288 border, format, type, pixels); |
| 3289 tex->setLevelInfo(target, level, internalformat, width, height, type); | 3289 tex->setLevelInfo(target, level, internalformat, width, height, type); |
| 3290 } | 3290 } |
| 3291 | 3291 |
| 3292 void WebGLRenderingContext::texImage2DImpl(GC3Denum target, GC3Dint level, GC3De
num internalformat, GC3Denum format, GC3Denum type, Image* image, GraphicsContex
t3D::ImageHtmlDomSource domSource, bool flipY, bool premultiplyAlpha, ExceptionS
tate& exceptionState) | 3292 void WebGLRenderingContext::texImage2DImpl(GC3Denum target, GC3Dint level, GC3De
num internalformat, GC3Denum format, GC3Denum type, Image* image, GraphicsContex
t3D::ImageHtmlDomSource domSource, bool flipY, bool premultiplyAlpha, ExceptionS
tate& exceptionState) |
| 3293 { | 3293 { |
| 3294 // All calling functions check isContextLost, so a duplicate check is not ne
eded here. | 3294 // All calling functions check isContextLost, so a duplicate check is not ne
eded here. |
| 3295 Vector<uint8_t> data; | 3295 Vector<uint8_t> data; |
| 3296 GraphicsContext3D::ImageExtractor imageExtractor(image, domSource, premultip
lyAlpha, m_unpackColorspaceConversion == GraphicsContext3D::NONE); | 3296 GraphicsContext3D::ImageExtractor imageExtractor(image, domSource, premultip
lyAlpha, m_unpackColorspaceConversion == GL_NONE); |
| 3297 if (!imageExtractor.extractSucceeded()) { | 3297 if (!imageExtractor.extractSucceeded()) { |
| 3298 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texImage2D", "bad i
mage data"); | 3298 synthesizeGLError(GL_INVALID_VALUE, "texImage2D", "bad image data"); |
| 3299 return; | 3299 return; |
| 3300 } | 3300 } |
| 3301 GraphicsContext3D::DataFormat sourceDataFormat = imageExtractor.imageSourceF
ormat(); | 3301 GraphicsContext3D::DataFormat sourceDataFormat = imageExtractor.imageSourceF
ormat(); |
| 3302 GraphicsContext3D::AlphaOp alphaOp = imageExtractor.imageAlphaOp(); | 3302 GraphicsContext3D::AlphaOp alphaOp = imageExtractor.imageAlphaOp(); |
| 3303 const void* imagePixelData = imageExtractor.imagePixelData(); | 3303 const void* imagePixelData = imageExtractor.imagePixelData(); |
| 3304 | 3304 |
| 3305 bool needConversion = true; | 3305 bool needConversion = true; |
| 3306 if (type == GraphicsContext3D::UNSIGNED_BYTE && sourceDataFormat == Graphics
Context3D::DataFormatRGBA8 && format == GraphicsContext3D::RGBA && alphaOp == Gr
aphicsContext3D::AlphaDoNothing && !flipY) | 3306 if (type == GL_UNSIGNED_BYTE && sourceDataFormat == GraphicsContext3D::DataF
ormatRGBA8 && format == GL_RGBA && alphaOp == GraphicsContext3D::AlphaDoNothing
&& !flipY) |
| 3307 needConversion = false; | 3307 needConversion = false; |
| 3308 else { | 3308 else { |
| 3309 if (!m_context->packImageData(image, imagePixelData, format, type, flipY
, alphaOp, sourceDataFormat, imageExtractor.imageWidth(), imageExtractor.imageHe
ight(), imageExtractor.imageSourceUnpackAlignment(), data)) { | 3309 if (!m_context->packImageData(image, imagePixelData, format, type, flipY
, alphaOp, sourceDataFormat, imageExtractor.imageWidth(), imageExtractor.imageHe
ight(), imageExtractor.imageSourceUnpackAlignment(), data)) { |
| 3310 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texImage2D", "p
ackImage error"); | 3310 synthesizeGLError(GL_INVALID_VALUE, "texImage2D", "packImage error")
; |
| 3311 return; | 3311 return; |
| 3312 } | 3312 } |
| 3313 } | 3313 } |
| 3314 | 3314 |
| 3315 if (m_unpackAlignment != 1) | 3315 if (m_unpackAlignment != 1) |
| 3316 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1); | 3316 m_context->pixelStorei(GL_UNPACK_ALIGNMENT, 1); |
| 3317 texImage2DBase(target, level, internalformat, image->width(), image->height(
), 0, format, type, needConversion ? data.data() : imagePixelData, exceptionStat
e); | 3317 texImage2DBase(target, level, internalformat, image->width(), image->height(
), 0, format, type, needConversion ? data.data() : imagePixelData, exceptionStat
e); |
| 3318 if (m_unpackAlignment != 1) | 3318 if (m_unpackAlignment != 1) |
| 3319 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlig
nment); | 3319 m_context->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment); |
| 3320 } | 3320 } |
| 3321 | 3321 |
| 3322 bool WebGLRenderingContext::validateTexFunc(const char* functionName, TexFuncVal
idationFunctionType functionType, TexFuncValidationSourceType sourceType, GC3Den
um target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei he
ight, GC3Dint border, GC3Denum format, GC3Denum type, GC3Dint xoffset, GC3Dint y
offset) | 3322 bool WebGLRenderingContext::validateTexFunc(const char* functionName, TexFuncVal
idationFunctionType functionType, TexFuncValidationSourceType sourceType, GC3Den
um target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei he
ight, GC3Dint border, GC3Denum format, GC3Denum type, GC3Dint xoffset, GC3Dint y
offset) |
| 3323 { | 3323 { |
| 3324 if (!validateTexFuncParameters(functionName, functionType, target, level, in
ternalformat, width, height, border, format, type)) | 3324 if (!validateTexFuncParameters(functionName, functionType, target, level, in
ternalformat, width, height, border, format, type)) |
| 3325 return false; | 3325 return false; |
| 3326 | 3326 |
| 3327 WebGLTexture* texture = validateTextureBinding(functionName, target, true); | 3327 WebGLTexture* texture = validateTextureBinding(functionName, target, true); |
| 3328 if (!texture) | 3328 if (!texture) |
| 3329 return false; | 3329 return false; |
| 3330 | 3330 |
| 3331 if (functionType == NotTexSubImage2D) { | 3331 if (functionType == NotTexSubImage2D) { |
| 3332 if (level && WebGLTexture::isNPOT(width, height)) { | 3332 if (level && WebGLTexture::isNPOT(width, height)) { |
| 3333 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "l
evel > 0 not power of 2"); | 3333 synthesizeGLError(GL_INVALID_VALUE, functionName, "level > 0 not pow
er of 2"); |
| 3334 return false; | 3334 return false; |
| 3335 } | 3335 } |
| 3336 // For SourceArrayBufferView, function validateTexFuncData() would handl
e whether to validate the SettableTexFormat | 3336 // For SourceArrayBufferView, function validateTexFuncData() would handl
e whether to validate the SettableTexFormat |
| 3337 // by checking if the ArrayBufferView is null or not. | 3337 // by checking if the ArrayBufferView is null or not. |
| 3338 if (sourceType != SourceArrayBufferView) { | 3338 if (sourceType != SourceArrayBufferView) { |
| 3339 if (!validateSettableTexFormat(functionName, format)) | 3339 if (!validateSettableTexFormat(functionName, format)) |
| 3340 return false; | 3340 return false; |
| 3341 } | 3341 } |
| 3342 } else { | 3342 } else { |
| 3343 if (!validateSettableTexFormat(functionName, format)) | 3343 if (!validateSettableTexFormat(functionName, format)) |
| 3344 return false; | 3344 return false; |
| 3345 if (!validateSize(functionName, xoffset, yoffset)) | 3345 if (!validateSize(functionName, xoffset, yoffset)) |
| 3346 return false; | 3346 return false; |
| 3347 // Before checking if it is in the range, check if overflow happens firs
t. | 3347 // Before checking if it is in the range, check if overflow happens firs
t. |
| 3348 if (xoffset + width < 0 || yoffset + height < 0) { | 3348 if (xoffset + width < 0 || yoffset + height < 0) { |
| 3349 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "b
ad dimensions"); | 3349 synthesizeGLError(GL_INVALID_VALUE, functionName, "bad dimensions"); |
| 3350 return false; | 3350 return false; |
| 3351 } | 3351 } |
| 3352 if (xoffset + width > texture->getWidth(target, level) || yoffset + heig
ht > texture->getHeight(target, level)) { | 3352 if (xoffset + width > texture->getWidth(target, level) || yoffset + heig
ht > texture->getHeight(target, level)) { |
| 3353 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "d
imensions out of range"); | 3353 synthesizeGLError(GL_INVALID_VALUE, functionName, "dimensions out of
range"); |
| 3354 return false; | 3354 return false; |
| 3355 } | 3355 } |
| 3356 if (texture->getInternalFormat(target, level) != format || texture->getT
ype(target, level) != type) { | 3356 if (texture->getInternalFormat(target, level) != format || texture->getT
ype(target, level) != type) { |
| 3357 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName
, "type and format do not match texture"); | 3357 synthesizeGLError(GL_INVALID_OPERATION, functionName, "type and form
at do not match texture"); |
| 3358 return false; | 3358 return false; |
| 3359 } | 3359 } |
| 3360 } | 3360 } |
| 3361 | 3361 |
| 3362 return true; | 3362 return true; |
| 3363 } | 3363 } |
| 3364 | 3364 |
| 3365 PassRefPtr<Image> WebGLRenderingContext::drawImageIntoBuffer(Image* image, int w
idth, int height, int deviceScaleFactor) | 3365 PassRefPtr<Image> WebGLRenderingContext::drawImageIntoBuffer(Image* image, int w
idth, int height, int deviceScaleFactor) |
| 3366 { | 3366 { |
| 3367 IntSize size(width, height); | 3367 IntSize size(width, height); |
| 3368 size.scale(deviceScaleFactor); | 3368 size.scale(deviceScaleFactor); |
| 3369 ImageBuffer* buf = m_generatedImageCache.imageBuffer(size); | 3369 ImageBuffer* buf = m_generatedImageCache.imageBuffer(size); |
| 3370 if (!buf) { | 3370 if (!buf) { |
| 3371 synthesizeGLError(GraphicsContext3D::OUT_OF_MEMORY, "texImage2D", "out o
f memory"); | 3371 synthesizeGLError(GL_OUT_OF_MEMORY, "texImage2D", "out of memory"); |
| 3372 return 0; | 3372 return 0; |
| 3373 } | 3373 } |
| 3374 | 3374 |
| 3375 IntRect srcRect(IntPoint(), image->size()); | 3375 IntRect srcRect(IntPoint(), image->size()); |
| 3376 IntRect destRect(0, 0, size.width(), size.height()); | 3376 IntRect destRect(0, 0, size.width(), size.height()); |
| 3377 buf->context()->drawImage(image, destRect, srcRect); | 3377 buf->context()->drawImage(image, destRect, srcRect); |
| 3378 return buf->copyImage(ImageBuffer::fastCopyImageMode()); | 3378 return buf->copyImage(ImageBuffer::fastCopyImageMode()); |
| 3379 } | 3379 } |
| 3380 | 3380 |
| 3381 void WebGLRenderingContext::texImage2D(GC3Denum target, GC3Dint level, GC3Denum
internalformat, | 3381 void WebGLRenderingContext::texImage2D(GC3Denum target, GC3Dint level, GC3Denum
internalformat, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 3392 if (!m_context->extractTextureData(width, height, format, type, | 3392 if (!m_context->extractTextureData(width, height, format, type, |
| 3393 m_unpackAlignment, | 3393 m_unpackAlignment, |
| 3394 m_unpackFlipY, m_unpackPremultiplyAlp
ha, | 3394 m_unpackFlipY, m_unpackPremultiplyAlp
ha, |
| 3395 data, | 3395 data, |
| 3396 tempData)) | 3396 tempData)) |
| 3397 return; | 3397 return; |
| 3398 data = tempData.data(); | 3398 data = tempData.data(); |
| 3399 changeUnpackAlignment = true; | 3399 changeUnpackAlignment = true; |
| 3400 } | 3400 } |
| 3401 if (changeUnpackAlignment) | 3401 if (changeUnpackAlignment) |
| 3402 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1); | 3402 m_context->pixelStorei(GL_UNPACK_ALIGNMENT, 1); |
| 3403 texImage2DBase(target, level, internalformat, width, height, border, format,
type, data, exceptionState); | 3403 texImage2DBase(target, level, internalformat, width, height, border, format,
type, data, exceptionState); |
| 3404 if (changeUnpackAlignment) | 3404 if (changeUnpackAlignment) |
| 3405 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlig
nment); | 3405 m_context->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment); |
| 3406 } | 3406 } |
| 3407 | 3407 |
| 3408 void WebGLRenderingContext::texImage2D(GC3Denum target, GC3Dint level, GC3Denum
internalformat, | 3408 void WebGLRenderingContext::texImage2D(GC3Denum target, GC3Dint level, GC3Denum
internalformat, |
| 3409 GC3Denum format, GC3Denum type, ImageData* pixels, ExceptionState& exception
State) | 3409 GC3Denum format, GC3Denum type, ImageData* pixels, ExceptionState& exception
State) |
| 3410 { | 3410 { |
| 3411 if (isContextLost() || !pixels || !validateTexFunc("texImage2D", NotTexSubIm
age2D, SourceImageData, target, level, internalformat, pixels->width(), pixels->
height(), 0, format, type, 0, 0)) | 3411 if (isContextLost() || !pixels || !validateTexFunc("texImage2D", NotTexSubIm
age2D, SourceImageData, target, level, internalformat, pixels->width(), pixels->
height(), 0, format, type, 0, 0)) |
| 3412 return; | 3412 return; |
| 3413 Vector<uint8_t> data; | 3413 Vector<uint8_t> data; |
| 3414 bool needConversion = true; | 3414 bool needConversion = true; |
| 3415 // The data from ImageData is always of format RGBA8. | 3415 // The data from ImageData is always of format RGBA8. |
| 3416 // No conversion is needed if destination format is RGBA and type is USIGNED
_BYTE and no Flip or Premultiply operation is required. | 3416 // No conversion is needed if destination format is RGBA and type is USIGNED
_BYTE and no Flip or Premultiply operation is required. |
| 3417 if (!m_unpackFlipY && !m_unpackPremultiplyAlpha && format == GraphicsContext
3D::RGBA && type == GraphicsContext3D::UNSIGNED_BYTE) | 3417 if (!m_unpackFlipY && !m_unpackPremultiplyAlpha && format == GL_RGBA && type
== GL_UNSIGNED_BYTE) |
| 3418 needConversion = false; | 3418 needConversion = false; |
| 3419 else { | 3419 else { |
| 3420 if (!m_context->extractImageData(pixels->data()->data(), pixels->size(),
format, type, m_unpackFlipY, m_unpackPremultiplyAlpha, data)) { | 3420 if (!m_context->extractImageData(pixels->data()->data(), pixels->size(),
format, type, m_unpackFlipY, m_unpackPremultiplyAlpha, data)) { |
| 3421 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texImage2D", "b
ad image data"); | 3421 synthesizeGLError(GL_INVALID_VALUE, "texImage2D", "bad image data"); |
| 3422 return; | 3422 return; |
| 3423 } | 3423 } |
| 3424 } | 3424 } |
| 3425 if (m_unpackAlignment != 1) | 3425 if (m_unpackAlignment != 1) |
| 3426 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1); | 3426 m_context->pixelStorei(GL_UNPACK_ALIGNMENT, 1); |
| 3427 texImage2DBase(target, level, internalformat, pixels->width(), pixels->heigh
t(), 0, format, type, needConversion ? data.data() : pixels->data()->data(), exc
eptionState); | 3427 texImage2DBase(target, level, internalformat, pixels->width(), pixels->heigh
t(), 0, format, type, needConversion ? data.data() : pixels->data()->data(), exc
eptionState); |
| 3428 if (m_unpackAlignment != 1) | 3428 if (m_unpackAlignment != 1) |
| 3429 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlig
nment); | 3429 m_context->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment); |
| 3430 } | 3430 } |
| 3431 | 3431 |
| 3432 void WebGLRenderingContext::texImage2D(GC3Denum target, GC3Dint level, GC3Denum
internalformat, | 3432 void WebGLRenderingContext::texImage2D(GC3Denum target, GC3Dint level, GC3Denum
internalformat, |
| 3433 GC3Denum format, GC3Denum type, HTMLImageElement* image, ExceptionState& exc
eptionState) | 3433 GC3Denum format, GC3Denum type, HTMLImageElement* image, ExceptionState& exc
eptionState) |
| 3434 { | 3434 { |
| 3435 if (isContextLost() || !validateHTMLImageElement("texImage2D", image, except
ionState)) | 3435 if (isContextLost() || !validateHTMLImageElement("texImage2D", image, except
ionState)) |
| 3436 return; | 3436 return; |
| 3437 | 3437 |
| 3438 RefPtr<Image> imageForRender = image->cachedImage()->imageForRenderer(image-
>renderer()); | 3438 RefPtr<Image> imageForRender = image->cachedImage()->imageForRenderer(image-
>renderer()); |
| 3439 if (imageForRender->isSVGImage()) | 3439 if (imageForRender->isSVGImage()) |
| 3440 imageForRender = drawImageIntoBuffer(imageForRender.get(), image->width(
), image->height(), canvas()->deviceScaleFactor()); | 3440 imageForRender = drawImageIntoBuffer(imageForRender.get(), image->width(
), image->height(), canvas()->deviceScaleFactor()); |
| 3441 | 3441 |
| 3442 if (!imageForRender || !validateTexFunc("texImage2D", NotTexSubImage2D, Sour
ceHTMLImageElement, target, level, internalformat, imageForRender->width(), imag
eForRender->height(), 0, format, type, 0, 0)) | 3442 if (!imageForRender || !validateTexFunc("texImage2D", NotTexSubImage2D, Sour
ceHTMLImageElement, target, level, internalformat, imageForRender->width(), imag
eForRender->height(), 0, format, type, 0, 0)) |
| 3443 return; | 3443 return; |
| 3444 | 3444 |
| 3445 texImage2DImpl(target, level, internalformat, format, type, imageForRender.g
et(), GraphicsContext3D::HtmlDomImage, m_unpackFlipY, m_unpackPremultiplyAlpha,
exceptionState); | 3445 texImage2DImpl(target, level, internalformat, format, type, imageForRender.g
et(), GraphicsContext3D::HtmlDomImage, m_unpackFlipY, m_unpackPremultiplyAlpha,
exceptionState); |
| 3446 } | 3446 } |
| 3447 | 3447 |
| 3448 void WebGLRenderingContext::texImage2D(GC3Denum target, GC3Dint level, GC3Denum
internalformat, | 3448 void WebGLRenderingContext::texImage2D(GC3Denum target, GC3Dint level, GC3Denum
internalformat, |
| 3449 GC3Denum format, GC3Denum type, HTMLCanvasElement* canvas, ExceptionState& e
xceptionState) | 3449 GC3Denum format, GC3Denum type, HTMLCanvasElement* canvas, ExceptionState& e
xceptionState) |
| 3450 { | 3450 { |
| 3451 if (isContextLost() || !validateHTMLCanvasElement("texImage2D", canvas, exce
ptionState) || !validateTexFunc("texImage2D", NotTexSubImage2D, SourceHTMLCanvas
Element, target, level, internalformat, canvas->width(), canvas->height(), 0, fo
rmat, type, 0, 0)) | 3451 if (isContextLost() || !validateHTMLCanvasElement("texImage2D", canvas, exce
ptionState) || !validateTexFunc("texImage2D", NotTexSubImage2D, SourceHTMLCanvas
Element, target, level, internalformat, canvas->width(), canvas->height(), 0, fo
rmat, type, 0, 0)) |
| 3452 return; | 3452 return; |
| 3453 | 3453 |
| 3454 WebGLTexture* texture = validateTextureBinding("texImage2D", target, true); | 3454 WebGLTexture* texture = validateTextureBinding("texImage2D", target, true); |
| 3455 // If possible, copy from the canvas element directly to the texture | 3455 // If possible, copy from the canvas element directly to the texture |
| 3456 // via the GPU, without a read-back to system memory. | 3456 // via the GPU, without a read-back to system memory. |
| 3457 if (GraphicsContext3D::TEXTURE_2D == target && texture) { | 3457 if (GL_TEXTURE_2D == target && texture) { |
| 3458 if (!canvas->is3D()) { | 3458 if (!canvas->is3D()) { |
| 3459 ImageBuffer* buffer = canvas->buffer(); | 3459 ImageBuffer* buffer = canvas->buffer(); |
| 3460 if (buffer && buffer->copyToPlatformTexture(*m_context.get(), textur
e->object(), internalformat, type, | 3460 if (buffer && buffer->copyToPlatformTexture(*m_context.get(), textur
e->object(), internalformat, type, |
| 3461 level, m_unpackPremultiplyAlpha, m_unpackFlipY)) { | 3461 level, m_unpackPremultiplyAlpha, m_unpackFlipY)) { |
| 3462 texture->setLevelInfo(target, level, internalformat, canvas->wid
th(), canvas->height(), type); | 3462 texture->setLevelInfo(target, level, internalformat, canvas->wid
th(), canvas->height(), type); |
| 3463 return; | 3463 return; |
| 3464 } | 3464 } |
| 3465 } else { | 3465 } else { |
| 3466 WebGLRenderingContext* gl = toWebGLRenderingContext(canvas->renderin
gContext()); | 3466 WebGLRenderingContext* gl = toWebGLRenderingContext(canvas->renderin
gContext()); |
| 3467 if (gl && gl->m_drawingBuffer->copyToPlatformTexture(*m_context.get(
), texture->object(), internalformat, type, | 3467 if (gl && gl->m_drawingBuffer->copyToPlatformTexture(*m_context.get(
), texture->object(), internalformat, type, |
| 3468 level, m_unpackPremultiplyAlpha, m_unpackFlipY)) { | 3468 level, m_unpackPremultiplyAlpha, m_unpackFlipY)) { |
| 3469 texture->setLevelInfo(target, level, internalformat, canvas->wid
th(), canvas->height(), type); | 3469 texture->setLevelInfo(target, level, internalformat, canvas->wid
th(), canvas->height(), type); |
| 3470 return; | 3470 return; |
| 3471 } | 3471 } |
| 3472 } | 3472 } |
| 3473 } | 3473 } |
| 3474 | 3474 |
| 3475 RefPtr<ImageData> imageData = canvas->getImageData(); | 3475 RefPtr<ImageData> imageData = canvas->getImageData(); |
| 3476 if (imageData) | 3476 if (imageData) |
| 3477 texImage2D(target, level, internalformat, format, type, imageData.get(),
exceptionState); | 3477 texImage2D(target, level, internalformat, format, type, imageData.get(),
exceptionState); |
| 3478 else | 3478 else |
| 3479 texImage2DImpl(target, level, internalformat, format, type, canvas->copi
edImage(), GraphicsContext3D::HtmlDomCanvas, m_unpackFlipY, m_unpackPremultiplyA
lpha, exceptionState); | 3479 texImage2DImpl(target, level, internalformat, format, type, canvas->copi
edImage(), GraphicsContext3D::HtmlDomCanvas, m_unpackFlipY, m_unpackPremultiplyA
lpha, exceptionState); |
| 3480 } | 3480 } |
| 3481 | 3481 |
| 3482 PassRefPtr<Image> WebGLRenderingContext::videoFrameToImage(HTMLVideoElement* vid
eo, BackingStoreCopy backingStoreCopy) | 3482 PassRefPtr<Image> WebGLRenderingContext::videoFrameToImage(HTMLVideoElement* vid
eo, BackingStoreCopy backingStoreCopy) |
| 3483 { | 3483 { |
| 3484 IntSize size(video->videoWidth(), video->videoHeight()); | 3484 IntSize size(video->videoWidth(), video->videoHeight()); |
| 3485 ImageBuffer* buf = m_generatedImageCache.imageBuffer(size); | 3485 ImageBuffer* buf = m_generatedImageCache.imageBuffer(size); |
| 3486 if (!buf) { | 3486 if (!buf) { |
| 3487 synthesizeGLError(GraphicsContext3D::OUT_OF_MEMORY, "texImage2D", "out o
f memory"); | 3487 synthesizeGLError(GL_OUT_OF_MEMORY, "texImage2D", "out of memory"); |
| 3488 return 0; | 3488 return 0; |
| 3489 } | 3489 } |
| 3490 IntRect destRect(0, 0, size.width(), size.height()); | 3490 IntRect destRect(0, 0, size.width(), size.height()); |
| 3491 // FIXME: Turn this into a GPU-GPU texture copy instead of CPU readback. | 3491 // FIXME: Turn this into a GPU-GPU texture copy instead of CPU readback. |
| 3492 video->paintCurrentFrameInContext(buf->context(), destRect); | 3492 video->paintCurrentFrameInContext(buf->context(), destRect); |
| 3493 return buf->copyImage(backingStoreCopy); | 3493 return buf->copyImage(backingStoreCopy); |
| 3494 } | 3494 } |
| 3495 | 3495 |
| 3496 void WebGLRenderingContext::texImage2D(GC3Denum target, GC3Dint level, GC3Denum
internalformat, | 3496 void WebGLRenderingContext::texImage2D(GC3Denum target, GC3Dint level, GC3Denum
internalformat, |
| 3497 GC3Denum format, GC3Denum type, HTMLVideoElement* video, ExceptionState& exc
eptionState) | 3497 GC3Denum format, GC3Denum type, HTMLVideoElement* video, ExceptionState& exc
eptionState) |
| 3498 { | 3498 { |
| 3499 if (isContextLost() || !validateHTMLVideoElement("texImage2D", video, except
ionState) | 3499 if (isContextLost() || !validateHTMLVideoElement("texImage2D", video, except
ionState) |
| 3500 || !validateTexFunc("texImage2D", NotTexSubImage2D, SourceHTMLVideoEleme
nt, target, level, internalformat, video->videoWidth(), video->videoHeight(), 0,
format, type, 0, 0)) | 3500 || !validateTexFunc("texImage2D", NotTexSubImage2D, SourceHTMLVideoEleme
nt, target, level, internalformat, video->videoWidth(), video->videoHeight(), 0,
format, type, 0, 0)) |
| 3501 return; | 3501 return; |
| 3502 | 3502 |
| 3503 // Go through the fast path doing a GPU-GPU textures copy without a readback
to system memory if possible. | 3503 // Go through the fast path doing a GPU-GPU textures copy without a readback
to system memory if possible. |
| 3504 // Otherwise, it will fall back to the normal SW path. | 3504 // Otherwise, it will fall back to the normal SW path. |
| 3505 WebGLTexture* texture = validateTextureBinding("texImage2D", target, true); | 3505 WebGLTexture* texture = validateTextureBinding("texImage2D", target, true); |
| 3506 if (GraphicsContext3D::TEXTURE_2D == target && texture) { | 3506 if (GL_TEXTURE_2D == target && texture) { |
| 3507 if (video->copyVideoTextureToPlatformTexture(m_context.get(), texture->o
bject(), level, type, internalformat, m_unpackPremultiplyAlpha, m_unpackFlipY))
{ | 3507 if (video->copyVideoTextureToPlatformTexture(m_context.get(), texture->o
bject(), level, type, internalformat, m_unpackPremultiplyAlpha, m_unpackFlipY))
{ |
| 3508 texture->setLevelInfo(target, level, internalformat, video->videoWid
th(), video->videoHeight(), type); | 3508 texture->setLevelInfo(target, level, internalformat, video->videoWid
th(), video->videoHeight(), type); |
| 3509 return; | 3509 return; |
| 3510 } | 3510 } |
| 3511 } | 3511 } |
| 3512 | 3512 |
| 3513 // Normal pure SW path. | 3513 // Normal pure SW path. |
| 3514 RefPtr<Image> image = videoFrameToImage(video, ImageBuffer::fastCopyImageMod
e()); | 3514 RefPtr<Image> image = videoFrameToImage(video, ImageBuffer::fastCopyImageMod
e()); |
| 3515 if (!image) | 3515 if (!image) |
| 3516 return; | 3516 return; |
| 3517 texImage2DImpl(target, level, internalformat, format, type, image.get(), Gra
phicsContext3D::HtmlDomVideo, m_unpackFlipY, m_unpackPremultiplyAlpha, exception
State); | 3517 texImage2DImpl(target, level, internalformat, format, type, image.get(), Gra
phicsContext3D::HtmlDomVideo, m_unpackFlipY, m_unpackPremultiplyAlpha, exception
State); |
| 3518 } | 3518 } |
| 3519 | 3519 |
| 3520 void WebGLRenderingContext::texParameter(GC3Denum target, GC3Denum pname, GC3Dfl
oat paramf, GC3Dint parami, bool isFloat) | 3520 void WebGLRenderingContext::texParameter(GC3Denum target, GC3Denum pname, GC3Dfl
oat paramf, GC3Dint parami, bool isFloat) |
| 3521 { | 3521 { |
| 3522 if (isContextLost()) | 3522 if (isContextLost()) |
| 3523 return; | 3523 return; |
| 3524 WebGLTexture* tex = validateTextureBinding("texParameter", target, false); | 3524 WebGLTexture* tex = validateTextureBinding("texParameter", target, false); |
| 3525 if (!tex) | 3525 if (!tex) |
| 3526 return; | 3526 return; |
| 3527 switch (pname) { | 3527 switch (pname) { |
| 3528 case GraphicsContext3D::TEXTURE_MIN_FILTER: | 3528 case GL_TEXTURE_MIN_FILTER: |
| 3529 case GraphicsContext3D::TEXTURE_MAG_FILTER: | 3529 case GL_TEXTURE_MAG_FILTER: |
| 3530 break; | 3530 break; |
| 3531 case GraphicsContext3D::TEXTURE_WRAP_S: | 3531 case GL_TEXTURE_WRAP_S: |
| 3532 case GraphicsContext3D::TEXTURE_WRAP_T: | 3532 case GL_TEXTURE_WRAP_T: |
| 3533 if ((isFloat && paramf != GraphicsContext3D::CLAMP_TO_EDGE && paramf !=
GraphicsContext3D::MIRRORED_REPEAT && paramf != GraphicsContext3D::REPEAT) | 3533 if ((isFloat && paramf != GL_CLAMP_TO_EDGE && paramf != GL_MIRRORED_REPE
AT && paramf != GL_REPEAT) |
| 3534 || (!isFloat && parami != GraphicsContext3D::CLAMP_TO_EDGE && parami
!= GraphicsContext3D::MIRRORED_REPEAT && parami != GraphicsContext3D::REPEAT))
{ | 3534 || (!isFloat && parami != GL_CLAMP_TO_EDGE && parami != GL_MIRRORED_
REPEAT && parami != GL_REPEAT)) { |
| 3535 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "texParameter", "
invalid parameter"); | 3535 synthesizeGLError(GL_INVALID_ENUM, "texParameter", "invalid paramete
r"); |
| 3536 return; | 3536 return; |
| 3537 } | 3537 } |
| 3538 break; | 3538 break; |
| 3539 case Extensions3D::TEXTURE_MAX_ANISOTROPY_EXT: // EXT_texture_filter_anisotr
opic | 3539 case Extensions3D::TEXTURE_MAX_ANISOTROPY_EXT: // EXT_texture_filter_anisotr
opic |
| 3540 if (!m_extTextureFilterAnisotropic) { | 3540 if (!m_extTextureFilterAnisotropic) { |
| 3541 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "texParameter", "
invalid parameter, EXT_texture_filter_anisotropic not enabled"); | 3541 synthesizeGLError(GL_INVALID_ENUM, "texParameter", "invalid paramete
r, EXT_texture_filter_anisotropic not enabled"); |
| 3542 return; | 3542 return; |
| 3543 } | 3543 } |
| 3544 break; | 3544 break; |
| 3545 default: | 3545 default: |
| 3546 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "texParameter", "inva
lid parameter name"); | 3546 synthesizeGLError(GL_INVALID_ENUM, "texParameter", "invalid parameter na
me"); |
| 3547 return; | 3547 return; |
| 3548 } | 3548 } |
| 3549 if (isFloat) { | 3549 if (isFloat) { |
| 3550 tex->setParameterf(pname, paramf); | 3550 tex->setParameterf(pname, paramf); |
| 3551 m_context->texParameterf(target, pname, paramf); | 3551 m_context->texParameterf(target, pname, paramf); |
| 3552 } else { | 3552 } else { |
| 3553 tex->setParameteri(pname, parami); | 3553 tex->setParameteri(pname, parami); |
| 3554 m_context->texParameteri(target, pname, parami); | 3554 m_context->texParameteri(target, pname, parami); |
| 3555 } | 3555 } |
| 3556 } | 3556 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 3583 ASSERT(tex->getHeight(target, level) >= (yoffset + height)); | 3583 ASSERT(tex->getHeight(target, level) >= (yoffset + height)); |
| 3584 ASSERT(tex->getInternalFormat(target, level) == format); | 3584 ASSERT(tex->getInternalFormat(target, level) == format); |
| 3585 ASSERT(tex->getType(target, level) == type); | 3585 ASSERT(tex->getType(target, level) == type); |
| 3586 m_context->texSubImage2D(target, level, xoffset, yoffset, width, height, for
mat, type, pixels); | 3586 m_context->texSubImage2D(target, level, xoffset, yoffset, width, height, for
mat, type, pixels); |
| 3587 } | 3587 } |
| 3588 | 3588 |
| 3589 void WebGLRenderingContext::texSubImage2DImpl(GC3Denum target, GC3Dint level, GC
3Dint xoffset, GC3Dint yoffset, GC3Denum format, GC3Denum type, Image* image, Gr
aphicsContext3D::ImageHtmlDomSource domSource, bool flipY, bool premultiplyAlpha
, ExceptionState& exceptionState) | 3589 void WebGLRenderingContext::texSubImage2DImpl(GC3Denum target, GC3Dint level, GC
3Dint xoffset, GC3Dint yoffset, GC3Denum format, GC3Denum type, Image* image, Gr
aphicsContext3D::ImageHtmlDomSource domSource, bool flipY, bool premultiplyAlpha
, ExceptionState& exceptionState) |
| 3590 { | 3590 { |
| 3591 // All calling functions check isContextLost, so a duplicate check is not ne
eded here. | 3591 // All calling functions check isContextLost, so a duplicate check is not ne
eded here. |
| 3592 Vector<uint8_t> data; | 3592 Vector<uint8_t> data; |
| 3593 GraphicsContext3D::ImageExtractor imageExtractor(image, domSource, premultip
lyAlpha, m_unpackColorspaceConversion == GraphicsContext3D::NONE); | 3593 GraphicsContext3D::ImageExtractor imageExtractor(image, domSource, premultip
lyAlpha, m_unpackColorspaceConversion == GL_NONE); |
| 3594 if (!imageExtractor.extractSucceeded()) { | 3594 if (!imageExtractor.extractSucceeded()) { |
| 3595 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texSubImage2D", "ba
d image"); | 3595 synthesizeGLError(GL_INVALID_VALUE, "texSubImage2D", "bad image"); |
| 3596 return; | 3596 return; |
| 3597 } | 3597 } |
| 3598 GraphicsContext3D::DataFormat sourceDataFormat = imageExtractor.imageSourceF
ormat(); | 3598 GraphicsContext3D::DataFormat sourceDataFormat = imageExtractor.imageSourceF
ormat(); |
| 3599 GraphicsContext3D::AlphaOp alphaOp = imageExtractor.imageAlphaOp(); | 3599 GraphicsContext3D::AlphaOp alphaOp = imageExtractor.imageAlphaOp(); |
| 3600 const void* imagePixelData = imageExtractor.imagePixelData(); | 3600 const void* imagePixelData = imageExtractor.imagePixelData(); |
| 3601 | 3601 |
| 3602 bool needConversion = true; | 3602 bool needConversion = true; |
| 3603 if (type == GraphicsContext3D::UNSIGNED_BYTE && sourceDataFormat == Graphics
Context3D::DataFormatRGBA8 && format == GraphicsContext3D::RGBA && alphaOp == Gr
aphicsContext3D::AlphaDoNothing && !flipY) | 3603 if (type == GL_UNSIGNED_BYTE && sourceDataFormat == GraphicsContext3D::DataF
ormatRGBA8 && format == GL_RGBA && alphaOp == GraphicsContext3D::AlphaDoNothing
&& !flipY) |
| 3604 needConversion = false; | 3604 needConversion = false; |
| 3605 else { | 3605 else { |
| 3606 if (!m_context->packImageData(image, imagePixelData, format, type, flipY
, alphaOp, sourceDataFormat, imageExtractor.imageWidth(), imageExtractor.imageHe
ight(), imageExtractor.imageSourceUnpackAlignment(), data)) { | 3606 if (!m_context->packImageData(image, imagePixelData, format, type, flipY
, alphaOp, sourceDataFormat, imageExtractor.imageWidth(), imageExtractor.imageHe
ight(), imageExtractor.imageSourceUnpackAlignment(), data)) { |
| 3607 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texImage2D", "b
ad image data"); | 3607 synthesizeGLError(GL_INVALID_VALUE, "texImage2D", "bad image data"); |
| 3608 return; | 3608 return; |
| 3609 } | 3609 } |
| 3610 } | 3610 } |
| 3611 | 3611 |
| 3612 if (m_unpackAlignment != 1) | 3612 if (m_unpackAlignment != 1) |
| 3613 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1); | 3613 m_context->pixelStorei(GL_UNPACK_ALIGNMENT, 1); |
| 3614 texSubImage2DBase(target, level, xoffset, yoffset, image->width(), image->he
ight(), format, type, needConversion ? data.data() : imagePixelData, exceptionS
tate); | 3614 texSubImage2DBase(target, level, xoffset, yoffset, image->width(), image->he
ight(), format, type, needConversion ? data.data() : imagePixelData, exceptionS
tate); |
| 3615 if (m_unpackAlignment != 1) | 3615 if (m_unpackAlignment != 1) |
| 3616 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlig
nment); | 3616 m_context->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment); |
| 3617 } | 3617 } |
| 3618 | 3618 |
| 3619 void WebGLRenderingContext::texSubImage2D(GC3Denum target, GC3Dint level, GC3Din
t xoffset, GC3Dint yoffset, | 3619 void WebGLRenderingContext::texSubImage2D(GC3Denum target, GC3Dint level, GC3Din
t xoffset, GC3Dint yoffset, |
| 3620 GC3Dsizei width, GC3Dsizei height, | 3620 GC3Dsizei width, GC3Dsizei height, |
| 3621 GC3Denum format, GC3Denum type, ArrayBufferView* pixels, ExceptionState& exc
eptionState) | 3621 GC3Denum format, GC3Denum type, ArrayBufferView* pixels, ExceptionState& exc
eptionState) |
| 3622 { | 3622 { |
| 3623 if (isContextLost() || !validateTexFuncData("texSubImage2D", level, width, h
eight, format, type, pixels, NullNotAllowed) | 3623 if (isContextLost() || !validateTexFuncData("texSubImage2D", level, width, h
eight, format, type, pixels, NullNotAllowed) |
| 3624 || !validateTexFunc("texSubImage2D", TexSubImage2D, SourceArrayBufferVie
w, target, level, format, width, height, 0, format, type, xoffset, yoffset)) | 3624 || !validateTexFunc("texSubImage2D", TexSubImage2D, SourceArrayBufferVie
w, target, level, format, width, height, 0, format, type, xoffset, yoffset)) |
| 3625 return; | 3625 return; |
| 3626 void* data = pixels->baseAddress(); | 3626 void* data = pixels->baseAddress(); |
| 3627 Vector<uint8_t> tempData; | 3627 Vector<uint8_t> tempData; |
| 3628 bool changeUnpackAlignment = false; | 3628 bool changeUnpackAlignment = false; |
| 3629 if (data && (m_unpackFlipY || m_unpackPremultiplyAlpha)) { | 3629 if (data && (m_unpackFlipY || m_unpackPremultiplyAlpha)) { |
| 3630 if (!m_context->extractTextureData(width, height, format, type, | 3630 if (!m_context->extractTextureData(width, height, format, type, |
| 3631 m_unpackAlignment, | 3631 m_unpackAlignment, |
| 3632 m_unpackFlipY, m_unpackPremultiplyAlp
ha, | 3632 m_unpackFlipY, m_unpackPremultiplyAlp
ha, |
| 3633 data, | 3633 data, |
| 3634 tempData)) | 3634 tempData)) |
| 3635 return; | 3635 return; |
| 3636 data = tempData.data(); | 3636 data = tempData.data(); |
| 3637 changeUnpackAlignment = true; | 3637 changeUnpackAlignment = true; |
| 3638 } | 3638 } |
| 3639 if (changeUnpackAlignment) | 3639 if (changeUnpackAlignment) |
| 3640 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1); | 3640 m_context->pixelStorei(GL_UNPACK_ALIGNMENT, 1); |
| 3641 texSubImage2DBase(target, level, xoffset, yoffset, width, height, format, ty
pe, data, exceptionState); | 3641 texSubImage2DBase(target, level, xoffset, yoffset, width, height, format, ty
pe, data, exceptionState); |
| 3642 if (changeUnpackAlignment) | 3642 if (changeUnpackAlignment) |
| 3643 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlig
nment); | 3643 m_context->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment); |
| 3644 } | 3644 } |
| 3645 | 3645 |
| 3646 void WebGLRenderingContext::texSubImage2D(GC3Denum target, GC3Dint level, GC3Din
t xoffset, GC3Dint yoffset, | 3646 void WebGLRenderingContext::texSubImage2D(GC3Denum target, GC3Dint level, GC3Din
t xoffset, GC3Dint yoffset, |
| 3647 GC3Denum format, GC3Denum type, ImageData* pixels, ExceptionState& exception
State) | 3647 GC3Denum format, GC3Denum type, ImageData* pixels, ExceptionState& exception
State) |
| 3648 { | 3648 { |
| 3649 if (isContextLost() || !pixels || !validateTexFunc("texSubImage2D", TexSubIm
age2D, SourceImageData, target, level, format, pixels->width(), pixels->height(
), 0, format, type, xoffset, yoffset)) | 3649 if (isContextLost() || !pixels || !validateTexFunc("texSubImage2D", TexSubIm
age2D, SourceImageData, target, level, format, pixels->width(), pixels->height(
), 0, format, type, xoffset, yoffset)) |
| 3650 return; | 3650 return; |
| 3651 | 3651 |
| 3652 Vector<uint8_t> data; | 3652 Vector<uint8_t> data; |
| 3653 bool needConversion = true; | 3653 bool needConversion = true; |
| 3654 // The data from ImageData is always of format RGBA8. | 3654 // The data from ImageData is always of format RGBA8. |
| 3655 // No conversion is needed if destination format is RGBA and type is USIGNED
_BYTE and no Flip or Premultiply operation is required. | 3655 // No conversion is needed if destination format is RGBA and type is USIGNED
_BYTE and no Flip or Premultiply operation is required. |
| 3656 if (format == GraphicsContext3D::RGBA && type == GraphicsContext3D::UNSIGNED
_BYTE && !m_unpackFlipY && !m_unpackPremultiplyAlpha) | 3656 if (format == GL_RGBA && type == GL_UNSIGNED_BYTE && !m_unpackFlipY && !m_un
packPremultiplyAlpha) |
| 3657 needConversion = false; | 3657 needConversion = false; |
| 3658 else { | 3658 else { |
| 3659 if (!m_context->extractImageData(pixels->data()->data(), pixels->size(),
format, type, m_unpackFlipY, m_unpackPremultiplyAlpha, data)) { | 3659 if (!m_context->extractImageData(pixels->data()->data(), pixels->size(),
format, type, m_unpackFlipY, m_unpackPremultiplyAlpha, data)) { |
| 3660 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "texSubImage2D",
"bad image data"); | 3660 synthesizeGLError(GL_INVALID_VALUE, "texSubImage2D", "bad image data
"); |
| 3661 return; | 3661 return; |
| 3662 } | 3662 } |
| 3663 } | 3663 } |
| 3664 if (m_unpackAlignment != 1) | 3664 if (m_unpackAlignment != 1) |
| 3665 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, 1); | 3665 m_context->pixelStorei(GL_UNPACK_ALIGNMENT, 1); |
| 3666 texSubImage2DBase(target, level, xoffset, yoffset, pixels->width(), pixels->
height(), format, type, needConversion ? data.data() : pixels->data()->data(), e
xceptionState); | 3666 texSubImage2DBase(target, level, xoffset, yoffset, pixels->width(), pixels->
height(), format, type, needConversion ? data.data() : pixels->data()->data(), e
xceptionState); |
| 3667 if (m_unpackAlignment != 1) | 3667 if (m_unpackAlignment != 1) |
| 3668 m_context->pixelStorei(GraphicsContext3D::UNPACK_ALIGNMENT, m_unpackAlig
nment); | 3668 m_context->pixelStorei(GL_UNPACK_ALIGNMENT, m_unpackAlignment); |
| 3669 } | 3669 } |
| 3670 | 3670 |
| 3671 void WebGLRenderingContext::texSubImage2D(GC3Denum target, GC3Dint level, GC3Din
t xoffset, GC3Dint yoffset, | 3671 void WebGLRenderingContext::texSubImage2D(GC3Denum target, GC3Dint level, GC3Din
t xoffset, GC3Dint yoffset, |
| 3672 GC3Denum format, GC3Denum type, HTMLImageElement* image, ExceptionState& exc
eptionState) | 3672 GC3Denum format, GC3Denum type, HTMLImageElement* image, ExceptionState& exc
eptionState) |
| 3673 { | 3673 { |
| 3674 if (isContextLost() || !validateHTMLImageElement("texSubImage2D", image, exc
eptionState)) | 3674 if (isContextLost() || !validateHTMLImageElement("texSubImage2D", image, exc
eptionState)) |
| 3675 return; | 3675 return; |
| 3676 | 3676 |
| 3677 RefPtr<Image> imageForRender = image->cachedImage()->imageForRenderer(image-
>renderer()); | 3677 RefPtr<Image> imageForRender = image->cachedImage()->imageForRenderer(image-
>renderer()); |
| 3678 if (imageForRender->isSVGImage()) | 3678 if (imageForRender->isSVGImage()) |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3710 return; | 3710 return; |
| 3711 texSubImage2DImpl(target, level, xoffset, yoffset, format, type, image.get()
, GraphicsContext3D::HtmlDomVideo, m_unpackFlipY, m_unpackPremultiplyAlpha, exce
ptionState); | 3711 texSubImage2DImpl(target, level, xoffset, yoffset, format, type, image.get()
, GraphicsContext3D::HtmlDomVideo, m_unpackFlipY, m_unpackPremultiplyAlpha, exce
ptionState); |
| 3712 } | 3712 } |
| 3713 | 3713 |
| 3714 void WebGLRenderingContext::uniform1f(const WebGLUniformLocation* location, GC3D
float x) | 3714 void WebGLRenderingContext::uniform1f(const WebGLUniformLocation* location, GC3D
float x) |
| 3715 { | 3715 { |
| 3716 if (isContextLost() || !location) | 3716 if (isContextLost() || !location) |
| 3717 return; | 3717 return; |
| 3718 | 3718 |
| 3719 if (location->program() != m_currentProgram) { | 3719 if (location->program() != m_currentProgram) { |
| 3720 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "uniform1f", "lo
cation not for current program"); | 3720 synthesizeGLError(GL_INVALID_OPERATION, "uniform1f", "location not for c
urrent program"); |
| 3721 return; | 3721 return; |
| 3722 } | 3722 } |
| 3723 | 3723 |
| 3724 m_context->uniform1f(location->location(), x); | 3724 m_context->uniform1f(location->location(), x); |
| 3725 } | 3725 } |
| 3726 | 3726 |
| 3727 void WebGLRenderingContext::uniform1fv(const WebGLUniformLocation* location, Flo
at32Array* v) | 3727 void WebGLRenderingContext::uniform1fv(const WebGLUniformLocation* location, Flo
at32Array* v) |
| 3728 { | 3728 { |
| 3729 if (isContextLost() || !validateUniformParameters("uniform1fv", location, v,
1)) | 3729 if (isContextLost() || !validateUniformParameters("uniform1fv", location, v,
1)) |
| 3730 return; | 3730 return; |
| 3731 | 3731 |
| 3732 m_context->uniform1fv(location->location(), v->length(), v->data()); | 3732 m_context->uniform1fv(location->location(), v->length(), v->data()); |
| 3733 } | 3733 } |
| 3734 | 3734 |
| 3735 void WebGLRenderingContext::uniform1fv(const WebGLUniformLocation* location, GC3
Dfloat* v, GC3Dsizei size) | 3735 void WebGLRenderingContext::uniform1fv(const WebGLUniformLocation* location, GC3
Dfloat* v, GC3Dsizei size) |
| 3736 { | 3736 { |
| 3737 if (isContextLost() || !validateUniformParameters("uniform1fv", location, v,
size, 1)) | 3737 if (isContextLost() || !validateUniformParameters("uniform1fv", location, v,
size, 1)) |
| 3738 return; | 3738 return; |
| 3739 | 3739 |
| 3740 m_context->uniform1fv(location->location(), size, v); | 3740 m_context->uniform1fv(location->location(), size, v); |
| 3741 } | 3741 } |
| 3742 | 3742 |
| 3743 void WebGLRenderingContext::uniform1i(const WebGLUniformLocation* location, GC3D
int x) | 3743 void WebGLRenderingContext::uniform1i(const WebGLUniformLocation* location, GC3D
int x) |
| 3744 { | 3744 { |
| 3745 if (isContextLost() || !location) | 3745 if (isContextLost() || !location) |
| 3746 return; | 3746 return; |
| 3747 | 3747 |
| 3748 if (location->program() != m_currentProgram) { | 3748 if (location->program() != m_currentProgram) { |
| 3749 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "uniform1i", "lo
cation not for current program"); | 3749 synthesizeGLError(GL_INVALID_OPERATION, "uniform1i", "location not for c
urrent program"); |
| 3750 return; | 3750 return; |
| 3751 } | 3751 } |
| 3752 | 3752 |
| 3753 m_context->uniform1i(location->location(), x); | 3753 m_context->uniform1i(location->location(), x); |
| 3754 } | 3754 } |
| 3755 | 3755 |
| 3756 void WebGLRenderingContext::uniform1iv(const WebGLUniformLocation* location, Int
32Array* v) | 3756 void WebGLRenderingContext::uniform1iv(const WebGLUniformLocation* location, Int
32Array* v) |
| 3757 { | 3757 { |
| 3758 if (isContextLost() || !validateUniformParameters("uniform1iv", location, v,
1)) | 3758 if (isContextLost() || !validateUniformParameters("uniform1iv", location, v,
1)) |
| 3759 return; | 3759 return; |
| 3760 | 3760 |
| 3761 m_context->uniform1iv(location->location(), v->length(), v->data()); | 3761 m_context->uniform1iv(location->location(), v->length(), v->data()); |
| 3762 } | 3762 } |
| 3763 | 3763 |
| 3764 void WebGLRenderingContext::uniform1iv(const WebGLUniformLocation* location, GC3
Dint* v, GC3Dsizei size) | 3764 void WebGLRenderingContext::uniform1iv(const WebGLUniformLocation* location, GC3
Dint* v, GC3Dsizei size) |
| 3765 { | 3765 { |
| 3766 if (isContextLost() || !validateUniformParameters("uniform1iv", location, v,
size, 1)) | 3766 if (isContextLost() || !validateUniformParameters("uniform1iv", location, v,
size, 1)) |
| 3767 return; | 3767 return; |
| 3768 | 3768 |
| 3769 m_context->uniform1iv(location->location(), size, v); | 3769 m_context->uniform1iv(location->location(), size, v); |
| 3770 } | 3770 } |
| 3771 | 3771 |
| 3772 void WebGLRenderingContext::uniform2f(const WebGLUniformLocation* location, GC3D
float x, GC3Dfloat y) | 3772 void WebGLRenderingContext::uniform2f(const WebGLUniformLocation* location, GC3D
float x, GC3Dfloat y) |
| 3773 { | 3773 { |
| 3774 if (isContextLost() || !location) | 3774 if (isContextLost() || !location) |
| 3775 return; | 3775 return; |
| 3776 | 3776 |
| 3777 if (location->program() != m_currentProgram) { | 3777 if (location->program() != m_currentProgram) { |
| 3778 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "uniform2f", "lo
cation not for current program"); | 3778 synthesizeGLError(GL_INVALID_OPERATION, "uniform2f", "location not for c
urrent program"); |
| 3779 return; | 3779 return; |
| 3780 } | 3780 } |
| 3781 | 3781 |
| 3782 m_context->uniform2f(location->location(), x, y); | 3782 m_context->uniform2f(location->location(), x, y); |
| 3783 } | 3783 } |
| 3784 | 3784 |
| 3785 void WebGLRenderingContext::uniform2fv(const WebGLUniformLocation* location, Flo
at32Array* v) | 3785 void WebGLRenderingContext::uniform2fv(const WebGLUniformLocation* location, Flo
at32Array* v) |
| 3786 { | 3786 { |
| 3787 if (isContextLost() || !validateUniformParameters("uniform2fv", location, v,
2)) | 3787 if (isContextLost() || !validateUniformParameters("uniform2fv", location, v,
2)) |
| 3788 return; | 3788 return; |
| 3789 | 3789 |
| 3790 m_context->uniform2fv(location->location(), v->length() / 2, v->data()); | 3790 m_context->uniform2fv(location->location(), v->length() / 2, v->data()); |
| 3791 } | 3791 } |
| 3792 | 3792 |
| 3793 void WebGLRenderingContext::uniform2fv(const WebGLUniformLocation* location, GC3
Dfloat* v, GC3Dsizei size) | 3793 void WebGLRenderingContext::uniform2fv(const WebGLUniformLocation* location, GC3
Dfloat* v, GC3Dsizei size) |
| 3794 { | 3794 { |
| 3795 if (isContextLost() || !validateUniformParameters("uniform2fv", location, v,
size, 2)) | 3795 if (isContextLost() || !validateUniformParameters("uniform2fv", location, v,
size, 2)) |
| 3796 return; | 3796 return; |
| 3797 | 3797 |
| 3798 m_context->uniform2fv(location->location(), size / 2, v); | 3798 m_context->uniform2fv(location->location(), size / 2, v); |
| 3799 } | 3799 } |
| 3800 | 3800 |
| 3801 void WebGLRenderingContext::uniform2i(const WebGLUniformLocation* location, GC3D
int x, GC3Dint y) | 3801 void WebGLRenderingContext::uniform2i(const WebGLUniformLocation* location, GC3D
int x, GC3Dint y) |
| 3802 { | 3802 { |
| 3803 if (isContextLost() || !location) | 3803 if (isContextLost() || !location) |
| 3804 return; | 3804 return; |
| 3805 | 3805 |
| 3806 if (location->program() != m_currentProgram) { | 3806 if (location->program() != m_currentProgram) { |
| 3807 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "uniform2i", "lo
cation not for current program"); | 3807 synthesizeGLError(GL_INVALID_OPERATION, "uniform2i", "location not for c
urrent program"); |
| 3808 return; | 3808 return; |
| 3809 } | 3809 } |
| 3810 | 3810 |
| 3811 m_context->uniform2i(location->location(), x, y); | 3811 m_context->uniform2i(location->location(), x, y); |
| 3812 } | 3812 } |
| 3813 | 3813 |
| 3814 void WebGLRenderingContext::uniform2iv(const WebGLUniformLocation* location, Int
32Array* v) | 3814 void WebGLRenderingContext::uniform2iv(const WebGLUniformLocation* location, Int
32Array* v) |
| 3815 { | 3815 { |
| 3816 if (isContextLost() || !validateUniformParameters("uniform2iv", location, v,
2)) | 3816 if (isContextLost() || !validateUniformParameters("uniform2iv", location, v,
2)) |
| 3817 return; | 3817 return; |
| 3818 | 3818 |
| 3819 m_context->uniform2iv(location->location(), v->length() / 2, v->data()); | 3819 m_context->uniform2iv(location->location(), v->length() / 2, v->data()); |
| 3820 } | 3820 } |
| 3821 | 3821 |
| 3822 void WebGLRenderingContext::uniform2iv(const WebGLUniformLocation* location, GC3
Dint* v, GC3Dsizei size) | 3822 void WebGLRenderingContext::uniform2iv(const WebGLUniformLocation* location, GC3
Dint* v, GC3Dsizei size) |
| 3823 { | 3823 { |
| 3824 if (isContextLost() || !validateUniformParameters("uniform2iv", location, v,
size, 2)) | 3824 if (isContextLost() || !validateUniformParameters("uniform2iv", location, v,
size, 2)) |
| 3825 return; | 3825 return; |
| 3826 | 3826 |
| 3827 m_context->uniform2iv(location->location(), size / 2, v); | 3827 m_context->uniform2iv(location->location(), size / 2, v); |
| 3828 } | 3828 } |
| 3829 | 3829 |
| 3830 void WebGLRenderingContext::uniform3f(const WebGLUniformLocation* location, GC3D
float x, GC3Dfloat y, GC3Dfloat z) | 3830 void WebGLRenderingContext::uniform3f(const WebGLUniformLocation* location, GC3D
float x, GC3Dfloat y, GC3Dfloat z) |
| 3831 { | 3831 { |
| 3832 if (isContextLost() || !location) | 3832 if (isContextLost() || !location) |
| 3833 return; | 3833 return; |
| 3834 | 3834 |
| 3835 if (location->program() != m_currentProgram) { | 3835 if (location->program() != m_currentProgram) { |
| 3836 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "uniform3f", "lo
cation not for current program"); | 3836 synthesizeGLError(GL_INVALID_OPERATION, "uniform3f", "location not for c
urrent program"); |
| 3837 return; | 3837 return; |
| 3838 } | 3838 } |
| 3839 | 3839 |
| 3840 m_context->uniform3f(location->location(), x, y, z); | 3840 m_context->uniform3f(location->location(), x, y, z); |
| 3841 } | 3841 } |
| 3842 | 3842 |
| 3843 void WebGLRenderingContext::uniform3fv(const WebGLUniformLocation* location, Flo
at32Array* v) | 3843 void WebGLRenderingContext::uniform3fv(const WebGLUniformLocation* location, Flo
at32Array* v) |
| 3844 { | 3844 { |
| 3845 if (isContextLost() || !validateUniformParameters("uniform3fv", location, v,
3)) | 3845 if (isContextLost() || !validateUniformParameters("uniform3fv", location, v,
3)) |
| 3846 return; | 3846 return; |
| 3847 | 3847 |
| 3848 m_context->uniform3fv(location->location(), v->length() / 3, v->data()); | 3848 m_context->uniform3fv(location->location(), v->length() / 3, v->data()); |
| 3849 } | 3849 } |
| 3850 | 3850 |
| 3851 void WebGLRenderingContext::uniform3fv(const WebGLUniformLocation* location, GC3
Dfloat* v, GC3Dsizei size) | 3851 void WebGLRenderingContext::uniform3fv(const WebGLUniformLocation* location, GC3
Dfloat* v, GC3Dsizei size) |
| 3852 { | 3852 { |
| 3853 if (isContextLost() || !validateUniformParameters("uniform3fv", location, v,
size, 3)) | 3853 if (isContextLost() || !validateUniformParameters("uniform3fv", location, v,
size, 3)) |
| 3854 return; | 3854 return; |
| 3855 | 3855 |
| 3856 m_context->uniform3fv(location->location(), size / 3, v); | 3856 m_context->uniform3fv(location->location(), size / 3, v); |
| 3857 } | 3857 } |
| 3858 | 3858 |
| 3859 void WebGLRenderingContext::uniform3i(const WebGLUniformLocation* location, GC3D
int x, GC3Dint y, GC3Dint z) | 3859 void WebGLRenderingContext::uniform3i(const WebGLUniformLocation* location, GC3D
int x, GC3Dint y, GC3Dint z) |
| 3860 { | 3860 { |
| 3861 if (isContextLost() || !location) | 3861 if (isContextLost() || !location) |
| 3862 return; | 3862 return; |
| 3863 | 3863 |
| 3864 if (location->program() != m_currentProgram) { | 3864 if (location->program() != m_currentProgram) { |
| 3865 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "uniform3i", "lo
cation not for current program"); | 3865 synthesizeGLError(GL_INVALID_OPERATION, "uniform3i", "location not for c
urrent program"); |
| 3866 return; | 3866 return; |
| 3867 } | 3867 } |
| 3868 | 3868 |
| 3869 m_context->uniform3i(location->location(), x, y, z); | 3869 m_context->uniform3i(location->location(), x, y, z); |
| 3870 } | 3870 } |
| 3871 | 3871 |
| 3872 void WebGLRenderingContext::uniform3iv(const WebGLUniformLocation* location, Int
32Array* v) | 3872 void WebGLRenderingContext::uniform3iv(const WebGLUniformLocation* location, Int
32Array* v) |
| 3873 { | 3873 { |
| 3874 if (isContextLost() || !validateUniformParameters("uniform3iv", location, v,
3)) | 3874 if (isContextLost() || !validateUniformParameters("uniform3iv", location, v,
3)) |
| 3875 return; | 3875 return; |
| 3876 | 3876 |
| 3877 m_context->uniform3iv(location->location(), v->length() / 3, v->data()); | 3877 m_context->uniform3iv(location->location(), v->length() / 3, v->data()); |
| 3878 } | 3878 } |
| 3879 | 3879 |
| 3880 void WebGLRenderingContext::uniform3iv(const WebGLUniformLocation* location, GC3
Dint* v, GC3Dsizei size) | 3880 void WebGLRenderingContext::uniform3iv(const WebGLUniformLocation* location, GC3
Dint* v, GC3Dsizei size) |
| 3881 { | 3881 { |
| 3882 if (isContextLost() || !validateUniformParameters("uniform3iv", location, v,
size, 3)) | 3882 if (isContextLost() || !validateUniformParameters("uniform3iv", location, v,
size, 3)) |
| 3883 return; | 3883 return; |
| 3884 | 3884 |
| 3885 m_context->uniform3iv(location->location(), size / 3, v); | 3885 m_context->uniform3iv(location->location(), size / 3, v); |
| 3886 } | 3886 } |
| 3887 | 3887 |
| 3888 void WebGLRenderingContext::uniform4f(const WebGLUniformLocation* location, GC3D
float x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w) | 3888 void WebGLRenderingContext::uniform4f(const WebGLUniformLocation* location, GC3D
float x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w) |
| 3889 { | 3889 { |
| 3890 if (isContextLost() || !location) | 3890 if (isContextLost() || !location) |
| 3891 return; | 3891 return; |
| 3892 | 3892 |
| 3893 if (location->program() != m_currentProgram) { | 3893 if (location->program() != m_currentProgram) { |
| 3894 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "uniform4f", "lo
cation not for current program"); | 3894 synthesizeGLError(GL_INVALID_OPERATION, "uniform4f", "location not for c
urrent program"); |
| 3895 return; | 3895 return; |
| 3896 } | 3896 } |
| 3897 | 3897 |
| 3898 m_context->uniform4f(location->location(), x, y, z, w); | 3898 m_context->uniform4f(location->location(), x, y, z, w); |
| 3899 } | 3899 } |
| 3900 | 3900 |
| 3901 void WebGLRenderingContext::uniform4fv(const WebGLUniformLocation* location, Flo
at32Array* v) | 3901 void WebGLRenderingContext::uniform4fv(const WebGLUniformLocation* location, Flo
at32Array* v) |
| 3902 { | 3902 { |
| 3903 if (isContextLost() || !validateUniformParameters("uniform4fv", location, v,
4)) | 3903 if (isContextLost() || !validateUniformParameters("uniform4fv", location, v,
4)) |
| 3904 return; | 3904 return; |
| 3905 | 3905 |
| 3906 m_context->uniform4fv(location->location(), v->length() / 4, v->data()); | 3906 m_context->uniform4fv(location->location(), v->length() / 4, v->data()); |
| 3907 } | 3907 } |
| 3908 | 3908 |
| 3909 void WebGLRenderingContext::uniform4fv(const WebGLUniformLocation* location, GC3
Dfloat* v, GC3Dsizei size) | 3909 void WebGLRenderingContext::uniform4fv(const WebGLUniformLocation* location, GC3
Dfloat* v, GC3Dsizei size) |
| 3910 { | 3910 { |
| 3911 if (isContextLost() || !validateUniformParameters("uniform4fv", location, v,
size, 4)) | 3911 if (isContextLost() || !validateUniformParameters("uniform4fv", location, v,
size, 4)) |
| 3912 return; | 3912 return; |
| 3913 | 3913 |
| 3914 m_context->uniform4fv(location->location(), size / 4, v); | 3914 m_context->uniform4fv(location->location(), size / 4, v); |
| 3915 } | 3915 } |
| 3916 | 3916 |
| 3917 void WebGLRenderingContext::uniform4i(const WebGLUniformLocation* location, GC3D
int x, GC3Dint y, GC3Dint z, GC3Dint w) | 3917 void WebGLRenderingContext::uniform4i(const WebGLUniformLocation* location, GC3D
int x, GC3Dint y, GC3Dint z, GC3Dint w) |
| 3918 { | 3918 { |
| 3919 if (isContextLost() || !location) | 3919 if (isContextLost() || !location) |
| 3920 return; | 3920 return; |
| 3921 | 3921 |
| 3922 if (location->program() != m_currentProgram) { | 3922 if (location->program() != m_currentProgram) { |
| 3923 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "uniform4i", "lo
cation not for current program"); | 3923 synthesizeGLError(GL_INVALID_OPERATION, "uniform4i", "location not for c
urrent program"); |
| 3924 return; | 3924 return; |
| 3925 } | 3925 } |
| 3926 | 3926 |
| 3927 m_context->uniform4i(location->location(), x, y, z, w); | 3927 m_context->uniform4i(location->location(), x, y, z, w); |
| 3928 } | 3928 } |
| 3929 | 3929 |
| 3930 void WebGLRenderingContext::uniform4iv(const WebGLUniformLocation* location, Int
32Array* v) | 3930 void WebGLRenderingContext::uniform4iv(const WebGLUniformLocation* location, Int
32Array* v) |
| 3931 { | 3931 { |
| 3932 if (isContextLost() || !validateUniformParameters("uniform4iv", location, v,
4)) | 3932 if (isContextLost() || !validateUniformParameters("uniform4iv", location, v,
4)) |
| 3933 return; | 3933 return; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3986 } | 3986 } |
| 3987 | 3987 |
| 3988 void WebGLRenderingContext::useProgram(WebGLProgram* program) | 3988 void WebGLRenderingContext::useProgram(WebGLProgram* program) |
| 3989 { | 3989 { |
| 3990 bool deleted; | 3990 bool deleted; |
| 3991 if (!checkObjectToBeBound("useProgram", program, deleted)) | 3991 if (!checkObjectToBeBound("useProgram", program, deleted)) |
| 3992 return; | 3992 return; |
| 3993 if (deleted) | 3993 if (deleted) |
| 3994 program = 0; | 3994 program = 0; |
| 3995 if (program && !program->linkStatus()) { | 3995 if (program && !program->linkStatus()) { |
| 3996 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "useProgram", "p
rogram not valid"); | 3996 synthesizeGLError(GL_INVALID_OPERATION, "useProgram", "program not valid
"); |
| 3997 return; | 3997 return; |
| 3998 } | 3998 } |
| 3999 if (m_currentProgram != program) { | 3999 if (m_currentProgram != program) { |
| 4000 if (m_currentProgram) | 4000 if (m_currentProgram) |
| 4001 m_currentProgram->onDetached(graphicsContext3D()); | 4001 m_currentProgram->onDetached(graphicsContext3D()); |
| 4002 m_currentProgram = program; | 4002 m_currentProgram = program; |
| 4003 m_context->useProgram(objectOrZero(program)); | 4003 m_context->useProgram(objectOrZero(program)); |
| 4004 if (program) | 4004 if (program) |
| 4005 program->onAttached(); | 4005 program->onAttached(); |
| 4006 } | 4006 } |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4071 void WebGLRenderingContext::vertexAttrib4fv(GC3Duint index, GC3Dfloat* v, GC3Dsi
zei size) | 4071 void WebGLRenderingContext::vertexAttrib4fv(GC3Duint index, GC3Dfloat* v, GC3Dsi
zei size) |
| 4072 { | 4072 { |
| 4073 vertexAttribfvImpl("vertexAttrib4fv", index, v, size, 4); | 4073 vertexAttribfvImpl("vertexAttrib4fv", index, v, size, 4); |
| 4074 } | 4074 } |
| 4075 | 4075 |
| 4076 void WebGLRenderingContext::vertexAttribPointer(GC3Duint index, GC3Dint size, GC
3Denum type, GC3Dboolean normalized, GC3Dsizei stride, long long offset) | 4076 void WebGLRenderingContext::vertexAttribPointer(GC3Duint index, GC3Dint size, GC
3Denum type, GC3Dboolean normalized, GC3Dsizei stride, long long offset) |
| 4077 { | 4077 { |
| 4078 if (isContextLost()) | 4078 if (isContextLost()) |
| 4079 return; | 4079 return; |
| 4080 switch (type) { | 4080 switch (type) { |
| 4081 case GraphicsContext3D::BYTE: | 4081 case GL_BYTE: |
| 4082 case GraphicsContext3D::UNSIGNED_BYTE: | 4082 case GL_UNSIGNED_BYTE: |
| 4083 case GraphicsContext3D::SHORT: | 4083 case GL_SHORT: |
| 4084 case GraphicsContext3D::UNSIGNED_SHORT: | 4084 case GL_UNSIGNED_SHORT: |
| 4085 case GraphicsContext3D::FLOAT: | 4085 case GL_FLOAT: |
| 4086 break; | 4086 break; |
| 4087 default: | 4087 default: |
| 4088 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "vertexAttribPointer"
, "invalid type"); | 4088 synthesizeGLError(GL_INVALID_ENUM, "vertexAttribPointer", "invalid type"
); |
| 4089 return; | 4089 return; |
| 4090 } | 4090 } |
| 4091 if (index >= m_maxVertexAttribs) { | 4091 if (index >= m_maxVertexAttribs) { |
| 4092 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "vertexAttribPointer
", "index out of range"); | 4092 synthesizeGLError(GL_INVALID_VALUE, "vertexAttribPointer", "index out of
range"); |
| 4093 return; | 4093 return; |
| 4094 } | 4094 } |
| 4095 if (size < 1 || size > 4 || stride < 0 || stride > 255 || offset < 0) { | 4095 if (size < 1 || size > 4 || stride < 0 || stride > 255 || offset < 0) { |
| 4096 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "vertexAttribPointer
", "bad size, stride or offset"); | 4096 synthesizeGLError(GL_INVALID_VALUE, "vertexAttribPointer", "bad size, st
ride or offset"); |
| 4097 return; | 4097 return; |
| 4098 } | 4098 } |
| 4099 if (!m_boundArrayBuffer) { | 4099 if (!m_boundArrayBuffer) { |
| 4100 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "vertexAttribPoi
nter", "no bound ARRAY_BUFFER"); | 4100 synthesizeGLError(GL_INVALID_OPERATION, "vertexAttribPointer", "no bound
ARRAY_BUFFER"); |
| 4101 return; | 4101 return; |
| 4102 } | 4102 } |
| 4103 // Determine the number of elements the bound buffer can hold, given the off
set, size, type and stride | 4103 // Determine the number of elements the bound buffer can hold, given the off
set, size, type and stride |
| 4104 unsigned int typeSize = sizeInBytes(type); | 4104 unsigned int typeSize = sizeInBytes(type); |
| 4105 if (!typeSize) { | 4105 if (!typeSize) { |
| 4106 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "vertexAttribPointer"
, "invalid type"); | 4106 synthesizeGLError(GL_INVALID_ENUM, "vertexAttribPointer", "invalid type"
); |
| 4107 return; | 4107 return; |
| 4108 } | 4108 } |
| 4109 if ((stride % typeSize) || (static_cast<GC3Dintptr>(offset) % typeSize)) { | 4109 if ((stride % typeSize) || (static_cast<GC3Dintptr>(offset) % typeSize)) { |
| 4110 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "vertexAttribPoi
nter", "stride or offset not valid for type"); | 4110 synthesizeGLError(GL_INVALID_OPERATION, "vertexAttribPointer", "stride o
r offset not valid for type"); |
| 4111 return; | 4111 return; |
| 4112 } | 4112 } |
| 4113 GC3Dsizei bytesPerElement = size * typeSize; | 4113 GC3Dsizei bytesPerElement = size * typeSize; |
| 4114 | 4114 |
| 4115 m_boundVertexArrayObject->setVertexAttribState(index, bytesPerElement, size,
type, normalized, stride, static_cast<GC3Dintptr>(offset), m_boundArrayBuffer); | 4115 m_boundVertexArrayObject->setVertexAttribState(index, bytesPerElement, size,
type, normalized, stride, static_cast<GC3Dintptr>(offset), m_boundArrayBuffer); |
| 4116 m_context->vertexAttribPointer(index, size, type, normalized, stride, static
_cast<GC3Dintptr>(offset)); | 4116 m_context->vertexAttribPointer(index, size, type, normalized, stride, static
_cast<GC3Dintptr>(offset)); |
| 4117 } | 4117 } |
| 4118 | 4118 |
| 4119 void WebGLRenderingContext::vertexAttribDivisorANGLE(GC3Duint index, GC3Duint di
visor) | 4119 void WebGLRenderingContext::vertexAttribDivisorANGLE(GC3Duint index, GC3Duint di
visor) |
| 4120 { | 4120 { |
| 4121 if (isContextLost()) | 4121 if (isContextLost()) |
| 4122 return; | 4122 return; |
| 4123 | 4123 |
| 4124 if (index >= m_maxVertexAttribs) { | 4124 if (index >= m_maxVertexAttribs) { |
| 4125 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "vertexAttribDivisor
ANGLE", "index out of range"); | 4125 synthesizeGLError(GL_INVALID_VALUE, "vertexAttribDivisorANGLE", "index o
ut of range"); |
| 4126 return; | 4126 return; |
| 4127 } | 4127 } |
| 4128 | 4128 |
| 4129 m_boundVertexArrayObject->setVertexAttribDivisor(index, divisor); | 4129 m_boundVertexArrayObject->setVertexAttribDivisor(index, divisor); |
| 4130 m_context->extensions()->vertexAttribDivisorANGLE(index, divisor); | 4130 m_context->extensions()->vertexAttribDivisorANGLE(index, divisor); |
| 4131 } | 4131 } |
| 4132 | 4132 |
| 4133 void WebGLRenderingContext::viewport(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3D
sizei height) | 4133 void WebGLRenderingContext::viewport(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3D
sizei height) |
| 4134 { | 4134 { |
| 4135 if (isContextLost()) | 4135 if (isContextLost()) |
| 4136 return; | 4136 return; |
| 4137 if (!validateSize("viewport", width, height)) | 4137 if (!validateSize("viewport", width, height)) |
| 4138 return; | 4138 return; |
| 4139 m_context->viewport(x, y, width, height); | 4139 m_context->viewport(x, y, width, height); |
| 4140 } | 4140 } |
| 4141 | 4141 |
| 4142 void WebGLRenderingContext::forceLostContext(WebGLRenderingContext::LostContextM
ode mode) | 4142 void WebGLRenderingContext::forceLostContext(WebGLRenderingContext::LostContextM
ode mode) |
| 4143 { | 4143 { |
| 4144 if (isContextLost()) { | 4144 if (isContextLost()) { |
| 4145 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "loseContext", "
context already lost"); | 4145 synthesizeGLError(GL_INVALID_OPERATION, "loseContext", "context already
lost"); |
| 4146 return; | 4146 return; |
| 4147 } | 4147 } |
| 4148 | 4148 |
| 4149 m_contextGroup->loseContextGroup(mode); | 4149 m_contextGroup->loseContextGroup(mode); |
| 4150 } | 4150 } |
| 4151 | 4151 |
| 4152 void WebGLRenderingContext::loseContextImpl(WebGLRenderingContext::LostContextMo
de mode) | 4152 void WebGLRenderingContext::loseContextImpl(WebGLRenderingContext::LostContextMo
de mode) |
| 4153 { | 4153 { |
| 4154 if (isContextLost()) | 4154 if (isContextLost()) |
| 4155 return; | 4155 return; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 4175 ExtensionTracker* tracker = m_extensions[i]; | 4175 ExtensionTracker* tracker = m_extensions[i]; |
| 4176 tracker->loseExtension(); | 4176 tracker->loseExtension(); |
| 4177 } | 4177 } |
| 4178 | 4178 |
| 4179 removeAllCompressedTextureFormats(); | 4179 removeAllCompressedTextureFormats(); |
| 4180 | 4180 |
| 4181 if (mode != RealLostContext) | 4181 if (mode != RealLostContext) |
| 4182 destroyGraphicsContext3D(); | 4182 destroyGraphicsContext3D(); |
| 4183 | 4183 |
| 4184 ConsoleDisplayPreference display = (mode == RealLostContext) ? DisplayInCons
ole: DontDisplayInConsole; | 4184 ConsoleDisplayPreference display = (mode == RealLostContext) ? DisplayInCons
ole: DontDisplayInConsole; |
| 4185 synthesizeGLError(GraphicsContext3D::CONTEXT_LOST_WEBGL, "loseContext", "con
text lost", display); | 4185 synthesizeGLError(GC3D_CONTEXT_LOST_WEBGL, "loseContext", "context lost", di
splay); |
| 4186 | 4186 |
| 4187 // Don't allow restoration unless the context lost event has both been | 4187 // Don't allow restoration unless the context lost event has both been |
| 4188 // dispatched and its default behavior prevented. | 4188 // dispatched and its default behavior prevented. |
| 4189 m_restoreAllowed = false; | 4189 m_restoreAllowed = false; |
| 4190 | 4190 |
| 4191 // Always defer the dispatch of the context lost event, to implement | 4191 // Always defer the dispatch of the context lost event, to implement |
| 4192 // the spec behavior of queueing a task. | 4192 // the spec behavior of queueing a task. |
| 4193 m_dispatchContextLostEventTimer.startOneShot(0); | 4193 m_dispatchContextLostEventTimer.startOneShot(0); |
| 4194 } | 4194 } |
| 4195 | 4195 |
| 4196 void WebGLRenderingContext::forceRestoreContext() | 4196 void WebGLRenderingContext::forceRestoreContext() |
| 4197 { | 4197 { |
| 4198 if (!isContextLost()) { | 4198 if (!isContextLost()) { |
| 4199 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "restoreContext"
, "context not lost"); | 4199 synthesizeGLError(GL_INVALID_OPERATION, "restoreContext", "context not l
ost"); |
| 4200 return; | 4200 return; |
| 4201 } | 4201 } |
| 4202 | 4202 |
| 4203 if (!m_restoreAllowed) { | 4203 if (!m_restoreAllowed) { |
| 4204 if (m_contextLostMode == SyntheticLostContext) | 4204 if (m_contextLostMode == SyntheticLostContext) |
| 4205 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "restoreCont
ext", "context restoration not allowed"); | 4205 synthesizeGLError(GL_INVALID_OPERATION, "restoreContext", "context r
estoration not allowed"); |
| 4206 return; | 4206 return; |
| 4207 } | 4207 } |
| 4208 | 4208 |
| 4209 if (!m_restoreTimer.isActive()) | 4209 if (!m_restoreTimer.isActive()) |
| 4210 m_restoreTimer.startOneShot(0); | 4210 m_restoreTimer.startOneShot(0); |
| 4211 } | 4211 } |
| 4212 | 4212 |
| 4213 blink::WebLayer* WebGLRenderingContext::platformLayer() const | 4213 blink::WebLayer* WebGLRenderingContext::platformLayer() const |
| 4214 { | 4214 { |
| 4215 return m_drawingBuffer->platformLayer(); | 4215 return m_drawingBuffer->platformLayer(); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4261 WebGLGetInfo WebGLRenderingContext::getBooleanParameter(GC3Denum pname) | 4261 WebGLGetInfo WebGLRenderingContext::getBooleanParameter(GC3Denum pname) |
| 4262 { | 4262 { |
| 4263 GC3Dboolean value = 0; | 4263 GC3Dboolean value = 0; |
| 4264 if (!isContextLost()) | 4264 if (!isContextLost()) |
| 4265 m_context->getBooleanv(pname, &value); | 4265 m_context->getBooleanv(pname, &value); |
| 4266 return WebGLGetInfo(static_cast<bool>(value)); | 4266 return WebGLGetInfo(static_cast<bool>(value)); |
| 4267 } | 4267 } |
| 4268 | 4268 |
| 4269 WebGLGetInfo WebGLRenderingContext::getBooleanArrayParameter(GC3Denum pname) | 4269 WebGLGetInfo WebGLRenderingContext::getBooleanArrayParameter(GC3Denum pname) |
| 4270 { | 4270 { |
| 4271 if (pname != GraphicsContext3D::COLOR_WRITEMASK) { | 4271 if (pname != GL_COLOR_WRITEMASK) { |
| 4272 notImplemented(); | 4272 notImplemented(); |
| 4273 return WebGLGetInfo(0, 0); | 4273 return WebGLGetInfo(0, 0); |
| 4274 } | 4274 } |
| 4275 GC3Dboolean value[4] = {0}; | 4275 GC3Dboolean value[4] = {0}; |
| 4276 if (!isContextLost()) | 4276 if (!isContextLost()) |
| 4277 m_context->getBooleanv(pname, value); | 4277 m_context->getBooleanv(pname, value); |
| 4278 bool boolValue[4]; | 4278 bool boolValue[4]; |
| 4279 for (int ii = 0; ii < 4; ++ii) | 4279 for (int ii = 0; ii < 4; ++ii) |
| 4280 boolValue[ii] = static_cast<bool>(value[ii]); | 4280 boolValue[ii] = static_cast<bool>(value[ii]); |
| 4281 return WebGLGetInfo(boolValue, 4); | 4281 return WebGLGetInfo(boolValue, 4); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 4305 return WebGLGetInfo(static_cast<unsigned int>(value)); | 4305 return WebGLGetInfo(static_cast<unsigned int>(value)); |
| 4306 } | 4306 } |
| 4307 | 4307 |
| 4308 WebGLGetInfo WebGLRenderingContext::getWebGLFloatArrayParameter(GC3Denum pname) | 4308 WebGLGetInfo WebGLRenderingContext::getWebGLFloatArrayParameter(GC3Denum pname) |
| 4309 { | 4309 { |
| 4310 GC3Dfloat value[4] = {0}; | 4310 GC3Dfloat value[4] = {0}; |
| 4311 if (!isContextLost()) | 4311 if (!isContextLost()) |
| 4312 m_context->getFloatv(pname, value); | 4312 m_context->getFloatv(pname, value); |
| 4313 unsigned length = 0; | 4313 unsigned length = 0; |
| 4314 switch (pname) { | 4314 switch (pname) { |
| 4315 case GraphicsContext3D::ALIASED_POINT_SIZE_RANGE: | 4315 case GL_ALIASED_POINT_SIZE_RANGE: |
| 4316 case GraphicsContext3D::ALIASED_LINE_WIDTH_RANGE: | 4316 case GL_ALIASED_LINE_WIDTH_RANGE: |
| 4317 case GraphicsContext3D::DEPTH_RANGE: | 4317 case GL_DEPTH_RANGE: |
| 4318 length = 2; | 4318 length = 2; |
| 4319 break; | 4319 break; |
| 4320 case GraphicsContext3D::BLEND_COLOR: | 4320 case GL_BLEND_COLOR: |
| 4321 case GraphicsContext3D::COLOR_CLEAR_VALUE: | 4321 case GL_COLOR_CLEAR_VALUE: |
| 4322 length = 4; | 4322 length = 4; |
| 4323 break; | 4323 break; |
| 4324 default: | 4324 default: |
| 4325 notImplemented(); | 4325 notImplemented(); |
| 4326 } | 4326 } |
| 4327 return WebGLGetInfo(Float32Array::create(value, length)); | 4327 return WebGLGetInfo(Float32Array::create(value, length)); |
| 4328 } | 4328 } |
| 4329 | 4329 |
| 4330 WebGLGetInfo WebGLRenderingContext::getWebGLIntArrayParameter(GC3Denum pname) | 4330 WebGLGetInfo WebGLRenderingContext::getWebGLIntArrayParameter(GC3Denum pname) |
| 4331 { | 4331 { |
| 4332 GC3Dint value[4] = {0}; | 4332 GC3Dint value[4] = {0}; |
| 4333 if (!isContextLost()) | 4333 if (!isContextLost()) |
| 4334 m_context->getIntegerv(pname, value); | 4334 m_context->getIntegerv(pname, value); |
| 4335 unsigned length = 0; | 4335 unsigned length = 0; |
| 4336 switch (pname) { | 4336 switch (pname) { |
| 4337 case GraphicsContext3D::MAX_VIEWPORT_DIMS: | 4337 case GL_MAX_VIEWPORT_DIMS: |
| 4338 length = 2; | 4338 length = 2; |
| 4339 break; | 4339 break; |
| 4340 case GraphicsContext3D::SCISSOR_BOX: | 4340 case GL_SCISSOR_BOX: |
| 4341 case GraphicsContext3D::VIEWPORT: | 4341 case GL_VIEWPORT: |
| 4342 length = 4; | 4342 length = 4; |
| 4343 break; | 4343 break; |
| 4344 default: | 4344 default: |
| 4345 notImplemented(); | 4345 notImplemented(); |
| 4346 } | 4346 } |
| 4347 return WebGLGetInfo(Int32Array::create(value, length)); | 4347 return WebGLGetInfo(Int32Array::create(value, length)); |
| 4348 } | 4348 } |
| 4349 | 4349 |
| 4350 void WebGLRenderingContext::handleTextureCompleteness(const char* functionName,
bool prepareToDraw) | 4350 void WebGLRenderingContext::handleTextureCompleteness(const char* functionName,
bool prepareToDraw) |
| 4351 { | 4351 { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 4370 + " is not renderable. It maybe non-power-of-2 and have inco
mpatible texture filtering or is not 'texture complete'." | 4370 + " is not renderable. It maybe non-power-of-2 and have inco
mpatible texture filtering or is not 'texture complete'." |
| 4371 + " Or the texture is Float or Half Float type with linear f
iltering while OES_float_linear or OES_half_float_linear extension is not enable
d."); | 4371 + " Or the texture is Float or Half Float type with linear f
iltering while OES_float_linear or OES_half_float_linear extension is not enable
d."); |
| 4372 emitGLWarning(functionName, msg.utf8().data()); | 4372 emitGLWarning(functionName, msg.utf8().data()); |
| 4373 tex2D = m_blackTexture2D.get(); | 4373 tex2D = m_blackTexture2D.get(); |
| 4374 texCubeMap = m_blackTextureCubeMap.get(); | 4374 texCubeMap = m_blackTextureCubeMap.get(); |
| 4375 } else { | 4375 } else { |
| 4376 tex2D = m_textureUnits[ii].m_texture2DBinding.get(); | 4376 tex2D = m_textureUnits[ii].m_texture2DBinding.get(); |
| 4377 texCubeMap = m_textureUnits[ii].m_textureCubeMapBinding.get(); | 4377 texCubeMap = m_textureUnits[ii].m_textureCubeMapBinding.get(); |
| 4378 } | 4378 } |
| 4379 if (m_textureUnits[ii].m_texture2DBinding && m_textureUnits[ii].m_te
xture2DBinding->needToUseBlackTexture(flag)) | 4379 if (m_textureUnits[ii].m_texture2DBinding && m_textureUnits[ii].m_te
xture2DBinding->needToUseBlackTexture(flag)) |
| 4380 m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, objectOrZe
ro(tex2D)); | 4380 m_context->bindTexture(GL_TEXTURE_2D, objectOrZero(tex2D)); |
| 4381 if (m_textureUnits[ii].m_textureCubeMapBinding && m_textureUnits[ii]
.m_textureCubeMapBinding->needToUseBlackTexture(flag)) | 4381 if (m_textureUnits[ii].m_textureCubeMapBinding && m_textureUnits[ii]
.m_textureCubeMapBinding->needToUseBlackTexture(flag)) |
| 4382 m_context->bindTexture(GraphicsContext3D::TEXTURE_CUBE_MAP, obje
ctOrZero(texCubeMap)); | 4382 m_context->bindTexture(GL_TEXTURE_CUBE_MAP, objectOrZero(texCube
Map)); |
| 4383 } | 4383 } |
| 4384 } | 4384 } |
| 4385 if (resetActiveUnit) | 4385 if (resetActiveUnit) |
| 4386 m_context->activeTexture(m_activeTextureUnit); | 4386 m_context->activeTexture(m_activeTextureUnit); |
| 4387 } | 4387 } |
| 4388 | 4388 |
| 4389 void WebGLRenderingContext::createFallbackBlackTextures1x1() | 4389 void WebGLRenderingContext::createFallbackBlackTextures1x1() |
| 4390 { | 4390 { |
| 4391 // All calling functions check isContextLost, so a duplicate check is not ne
eded here. | 4391 // All calling functions check isContextLost, so a duplicate check is not ne
eded here. |
| 4392 unsigned char black[] = {0, 0, 0, 255}; | 4392 unsigned char black[] = {0, 0, 0, 255}; |
| 4393 m_blackTexture2D = createTexture(); | 4393 m_blackTexture2D = createTexture(); |
| 4394 m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_blackTexture2D->obje
ct()); | 4394 m_context->bindTexture(GL_TEXTURE_2D, m_blackTexture2D->object()); |
| 4395 m_context->texImage2D(GraphicsContext3D::TEXTURE_2D, 0, GraphicsContext3D::R
GBA, 1, 1, | 4395 m_context->texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, |
| 4396 0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNE
D_BYTE, black); | 4396 0, GL_RGBA, GL_UNSIGNED_BYTE, black); |
| 4397 m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, 0); | 4397 m_context->bindTexture(GL_TEXTURE_2D, 0); |
| 4398 m_blackTextureCubeMap = createTexture(); | 4398 m_blackTextureCubeMap = createTexture(); |
| 4399 m_context->bindTexture(GraphicsContext3D::TEXTURE_CUBE_MAP, m_blackTextureCu
beMap->object()); | 4399 m_context->bindTexture(GL_TEXTURE_CUBE_MAP, m_blackTextureCubeMap->object())
; |
| 4400 m_context->texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_X, 0, Gra
phicsContext3D::RGBA, 1, 1, | 4400 m_context->texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 1, 1, |
| 4401 0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNE
D_BYTE, black); | 4401 0, GL_RGBA, GL_UNSIGNED_BYTE, black); |
| 4402 m_context->texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_X, 0, Gra
phicsContext3D::RGBA, 1, 1, | 4402 m_context->texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 1, 1, |
| 4403 0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNE
D_BYTE, black); | 4403 0, GL_RGBA, GL_UNSIGNED_BYTE, black); |
| 4404 m_context->texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Y, 0, Gra
phicsContext3D::RGBA, 1, 1, | 4404 m_context->texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, 1, 1, |
| 4405 0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNE
D_BYTE, black); | 4405 0, GL_RGBA, GL_UNSIGNED_BYTE, black); |
| 4406 m_context->texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, Gra
phicsContext3D::RGBA, 1, 1, | 4406 m_context->texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, 1, 1, |
| 4407 0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNE
D_BYTE, black); | 4407 0, GL_RGBA, GL_UNSIGNED_BYTE, black); |
| 4408 m_context->texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Z, 0, Gra
phicsContext3D::RGBA, 1, 1, | 4408 m_context->texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, 1, 1, |
| 4409 0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNE
D_BYTE, black); | 4409 0, GL_RGBA, GL_UNSIGNED_BYTE, black); |
| 4410 m_context->texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, Gra
phicsContext3D::RGBA, 1, 1, | 4410 m_context->texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, 1, 1, |
| 4411 0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNE
D_BYTE, black); | 4411 0, GL_RGBA, GL_UNSIGNED_BYTE, black); |
| 4412 m_context->bindTexture(GraphicsContext3D::TEXTURE_CUBE_MAP, 0); | 4412 m_context->bindTexture(GL_TEXTURE_CUBE_MAP, 0); |
| 4413 } | 4413 } |
| 4414 | 4414 |
| 4415 bool WebGLRenderingContext::isTexInternalFormatColorBufferCombinationValid(GC3De
num texInternalFormat, | 4415 bool WebGLRenderingContext::isTexInternalFormatColorBufferCombinationValid(GC3De
num texInternalFormat, |
| 4416 GC3De
num colorBufferFormat) | 4416 GC3De
num colorBufferFormat) |
| 4417 { | 4417 { |
| 4418 unsigned need = GraphicsContext3D::getChannelBitsByFormat(texInternalFormat)
; | 4418 unsigned need = GraphicsContext3D::getChannelBitsByFormat(texInternalFormat)
; |
| 4419 unsigned have = GraphicsContext3D::getChannelBitsByFormat(colorBufferFormat)
; | 4419 unsigned have = GraphicsContext3D::getChannelBitsByFormat(colorBufferFormat)
; |
| 4420 return (need & have) == need; | 4420 return (need & have) == need; |
| 4421 } | 4421 } |
| 4422 | 4422 |
| 4423 GC3Denum WebGLRenderingContext::boundFramebufferColorFormat() | 4423 GC3Denum WebGLRenderingContext::boundFramebufferColorFormat() |
| 4424 { | 4424 { |
| 4425 if (m_framebufferBinding && m_framebufferBinding->object()) | 4425 if (m_framebufferBinding && m_framebufferBinding->object()) |
| 4426 return m_framebufferBinding->colorBufferFormat(); | 4426 return m_framebufferBinding->colorBufferFormat(); |
| 4427 if (m_attributes.alpha) | 4427 if (m_attributes.alpha) |
| 4428 return GraphicsContext3D::RGBA; | 4428 return GL_RGBA; |
| 4429 return GraphicsContext3D::RGB; | 4429 return GL_RGB; |
| 4430 } | 4430 } |
| 4431 | 4431 |
| 4432 int WebGLRenderingContext::boundFramebufferWidth() | 4432 int WebGLRenderingContext::boundFramebufferWidth() |
| 4433 { | 4433 { |
| 4434 if (m_framebufferBinding && m_framebufferBinding->object()) | 4434 if (m_framebufferBinding && m_framebufferBinding->object()) |
| 4435 return m_framebufferBinding->colorBufferWidth(); | 4435 return m_framebufferBinding->colorBufferWidth(); |
| 4436 return m_drawingBuffer->size().width(); | 4436 return m_drawingBuffer->size().width(); |
| 4437 } | 4437 } |
| 4438 | 4438 |
| 4439 int WebGLRenderingContext::boundFramebufferHeight() | 4439 int WebGLRenderingContext::boundFramebufferHeight() |
| 4440 { | 4440 { |
| 4441 if (m_framebufferBinding && m_framebufferBinding->object()) | 4441 if (m_framebufferBinding && m_framebufferBinding->object()) |
| 4442 return m_framebufferBinding->colorBufferHeight(); | 4442 return m_framebufferBinding->colorBufferHeight(); |
| 4443 return m_drawingBuffer->size().height(); | 4443 return m_drawingBuffer->size().height(); |
| 4444 } | 4444 } |
| 4445 | 4445 |
| 4446 WebGLTexture* WebGLRenderingContext::validateTextureBinding(const char* function
Name, GC3Denum target, bool useSixEnumsForCubeMap) | 4446 WebGLTexture* WebGLRenderingContext::validateTextureBinding(const char* function
Name, GC3Denum target, bool useSixEnumsForCubeMap) |
| 4447 { | 4447 { |
| 4448 WebGLTexture* tex = 0; | 4448 WebGLTexture* tex = 0; |
| 4449 switch (target) { | 4449 switch (target) { |
| 4450 case GraphicsContext3D::TEXTURE_2D: | 4450 case GL_TEXTURE_2D: |
| 4451 tex = m_textureUnits[m_activeTextureUnit].m_texture2DBinding.get(); | 4451 tex = m_textureUnits[m_activeTextureUnit].m_texture2DBinding.get(); |
| 4452 break; | 4452 break; |
| 4453 case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_X: | 4453 case GL_TEXTURE_CUBE_MAP_POSITIVE_X: |
| 4454 case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_X: | 4454 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: |
| 4455 case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Y: | 4455 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: |
| 4456 case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Y: | 4456 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: |
| 4457 case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Z: | 4457 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: |
| 4458 case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Z: | 4458 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: |
| 4459 if (!useSixEnumsForCubeMap) { | 4459 if (!useSixEnumsForCubeMap) { |
| 4460 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "in
valid texture target"); | 4460 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid texture ta
rget"); |
| 4461 return 0; | 4461 return 0; |
| 4462 } | 4462 } |
| 4463 tex = m_textureUnits[m_activeTextureUnit].m_textureCubeMapBinding.get(); | 4463 tex = m_textureUnits[m_activeTextureUnit].m_textureCubeMapBinding.get(); |
| 4464 break; | 4464 break; |
| 4465 case GraphicsContext3D::TEXTURE_CUBE_MAP: | 4465 case GL_TEXTURE_CUBE_MAP: |
| 4466 if (useSixEnumsForCubeMap) { | 4466 if (useSixEnumsForCubeMap) { |
| 4467 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "in
valid texture target"); | 4467 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid texture ta
rget"); |
| 4468 return 0; | 4468 return 0; |
| 4469 } | 4469 } |
| 4470 tex = m_textureUnits[m_activeTextureUnit].m_textureCubeMapBinding.get(); | 4470 tex = m_textureUnits[m_activeTextureUnit].m_textureCubeMapBinding.get(); |
| 4471 break; | 4471 break; |
| 4472 default: | 4472 default: |
| 4473 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "invali
d texture target"); | 4473 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid texture target
"); |
| 4474 return 0; | 4474 return 0; |
| 4475 } | 4475 } |
| 4476 if (!tex) | 4476 if (!tex) |
| 4477 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, "n
o texture"); | 4477 synthesizeGLError(GL_INVALID_OPERATION, functionName, "no texture"); |
| 4478 return tex; | 4478 return tex; |
| 4479 } | 4479 } |
| 4480 | 4480 |
| 4481 bool WebGLRenderingContext::validateLocationLength(const char* functionName, con
st String& string) | 4481 bool WebGLRenderingContext::validateLocationLength(const char* functionName, con
st String& string) |
| 4482 { | 4482 { |
| 4483 const unsigned maxWebGLLocationLength = 256; | 4483 const unsigned maxWebGLLocationLength = 256; |
| 4484 if (string.length() > maxWebGLLocationLength) { | 4484 if (string.length() > maxWebGLLocationLength) { |
| 4485 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "locat
ion length > 256"); | 4485 synthesizeGLError(GL_INVALID_VALUE, functionName, "location length > 256
"); |
| 4486 return false; | 4486 return false; |
| 4487 } | 4487 } |
| 4488 return true; | 4488 return true; |
| 4489 } | 4489 } |
| 4490 | 4490 |
| 4491 bool WebGLRenderingContext::validateSize(const char* functionName, GC3Dint x, GC
3Dint y) | 4491 bool WebGLRenderingContext::validateSize(const char* functionName, GC3Dint x, GC
3Dint y) |
| 4492 { | 4492 { |
| 4493 if (x < 0 || y < 0) { | 4493 if (x < 0 || y < 0) { |
| 4494 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "size
< 0"); | 4494 synthesizeGLError(GL_INVALID_VALUE, functionName, "size < 0"); |
| 4495 return false; | 4495 return false; |
| 4496 } | 4496 } |
| 4497 return true; | 4497 return true; |
| 4498 } | 4498 } |
| 4499 | 4499 |
| 4500 bool WebGLRenderingContext::validateString(const char* functionName, const Strin
g& string) | 4500 bool WebGLRenderingContext::validateString(const char* functionName, const Strin
g& string) |
| 4501 { | 4501 { |
| 4502 for (size_t i = 0; i < string.length(); ++i) { | 4502 for (size_t i = 0; i < string.length(); ++i) { |
| 4503 if (!validateCharacter(string[i])) { | 4503 if (!validateCharacter(string[i])) { |
| 4504 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "s
tring not ASCII"); | 4504 synthesizeGLError(GL_INVALID_VALUE, functionName, "string not ASCII"
); |
| 4505 return false; | 4505 return false; |
| 4506 } | 4506 } |
| 4507 } | 4507 } |
| 4508 return true; | 4508 return true; |
| 4509 } | 4509 } |
| 4510 | 4510 |
| 4511 bool WebGLRenderingContext::validateTexFuncFormatAndType(const char* functionNam
e, GC3Denum format, GC3Denum type, GC3Dint level) | 4511 bool WebGLRenderingContext::validateTexFuncFormatAndType(const char* functionNam
e, GC3Denum format, GC3Denum type, GC3Dint level) |
| 4512 { | 4512 { |
| 4513 switch (format) { | 4513 switch (format) { |
| 4514 case GraphicsContext3D::ALPHA: | 4514 case GL_ALPHA: |
| 4515 case GraphicsContext3D::LUMINANCE: | 4515 case GL_LUMINANCE: |
| 4516 case GraphicsContext3D::LUMINANCE_ALPHA: | 4516 case GL_LUMINANCE_ALPHA: |
| 4517 case GraphicsContext3D::RGB: | 4517 case GL_RGB: |
| 4518 case GraphicsContext3D::RGBA: | 4518 case GL_RGBA: |
| 4519 break; | 4519 break; |
| 4520 case GraphicsContext3D::DEPTH_STENCIL: | 4520 case GL_DEPTH_STENCIL_OES: |
| 4521 case GraphicsContext3D::DEPTH_COMPONENT: | 4521 case GL_DEPTH_COMPONENT: |
| 4522 if (m_webglDepthTexture) | 4522 if (m_webglDepthTexture) |
| 4523 break; | 4523 break; |
| 4524 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "depth
texture formats not enabled"); | 4524 synthesizeGLError(GL_INVALID_ENUM, functionName, "depth texture formats
not enabled"); |
| 4525 return false; | 4525 return false; |
| 4526 default: | 4526 default: |
| 4527 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "invali
d texture format"); | 4527 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid texture format
"); |
| 4528 return false; | 4528 return false; |
| 4529 } | 4529 } |
| 4530 | 4530 |
| 4531 switch (type) { | 4531 switch (type) { |
| 4532 case GraphicsContext3D::UNSIGNED_BYTE: | 4532 case GL_UNSIGNED_BYTE: |
| 4533 case GraphicsContext3D::UNSIGNED_SHORT_5_6_5: | 4533 case GL_UNSIGNED_SHORT_5_6_5: |
| 4534 case GraphicsContext3D::UNSIGNED_SHORT_4_4_4_4: | 4534 case GL_UNSIGNED_SHORT_4_4_4_4: |
| 4535 case GraphicsContext3D::UNSIGNED_SHORT_5_5_5_1: | 4535 case GL_UNSIGNED_SHORT_5_5_5_1: |
| 4536 break; | 4536 break; |
| 4537 case GraphicsContext3D::FLOAT: | 4537 case GL_FLOAT: |
| 4538 if (m_oesTextureFloat) | 4538 if (m_oesTextureFloat) |
| 4539 break; | 4539 break; |
| 4540 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "invali
d texture type"); | 4540 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid texture type")
; |
| 4541 return false; | 4541 return false; |
| 4542 case GraphicsContext3D::HALF_FLOAT_OES: | 4542 case GL_HALF_FLOAT_OES: |
| 4543 if (m_oesTextureHalfFloat) | 4543 if (m_oesTextureHalfFloat) |
| 4544 break; | 4544 break; |
| 4545 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "invali
d texture type"); | 4545 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid texture type")
; |
| 4546 return false; | 4546 return false; |
| 4547 case GraphicsContext3D::UNSIGNED_INT: | 4547 case GL_UNSIGNED_INT: |
| 4548 case GraphicsContext3D::UNSIGNED_INT_24_8: | 4548 case GL_UNSIGNED_INT_24_8_OES: |
| 4549 case GraphicsContext3D::UNSIGNED_SHORT: | 4549 case GL_UNSIGNED_SHORT: |
| 4550 if (m_webglDepthTexture) | 4550 if (m_webglDepthTexture) |
| 4551 break; | 4551 break; |
| 4552 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "invali
d texture type"); | 4552 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid texture type")
; |
| 4553 return false; | 4553 return false; |
| 4554 default: | 4554 default: |
| 4555 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "invali
d texture type"); | 4555 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid texture type")
; |
| 4556 return false; | 4556 return false; |
| 4557 } | 4557 } |
| 4558 | 4558 |
| 4559 // Verify that the combination of format and type is supported. | 4559 // Verify that the combination of format and type is supported. |
| 4560 switch (format) { | 4560 switch (format) { |
| 4561 case GraphicsContext3D::ALPHA: | 4561 case GL_ALPHA: |
| 4562 case GraphicsContext3D::LUMINANCE: | 4562 case GL_LUMINANCE: |
| 4563 case GraphicsContext3D::LUMINANCE_ALPHA: | 4563 case GL_LUMINANCE_ALPHA: |
| 4564 if (type != GraphicsContext3D::UNSIGNED_BYTE | 4564 if (type != GL_UNSIGNED_BYTE |
| 4565 && type != GraphicsContext3D::FLOAT | 4565 && type != GL_FLOAT |
| 4566 && type != GraphicsContext3D::HALF_FLOAT_OES) { | 4566 && type != GL_HALF_FLOAT_OES) { |
| 4567 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName
, "invalid type for format"); | 4567 synthesizeGLError(GL_INVALID_OPERATION, functionName, "invalid type
for format"); |
| 4568 return false; | 4568 return false; |
| 4569 } | 4569 } |
| 4570 break; | 4570 break; |
| 4571 case GraphicsContext3D::RGB: | 4571 case GL_RGB: |
| 4572 if (type != GraphicsContext3D::UNSIGNED_BYTE | 4572 if (type != GL_UNSIGNED_BYTE |
| 4573 && type != GraphicsContext3D::UNSIGNED_SHORT_5_6_5 | 4573 && type != GL_UNSIGNED_SHORT_5_6_5 |
| 4574 && type != GraphicsContext3D::FLOAT | 4574 && type != GL_FLOAT |
| 4575 && type != GraphicsContext3D::HALF_FLOAT_OES) { | 4575 && type != GL_HALF_FLOAT_OES) { |
| 4576 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName
, "invalid type for RGB format"); | 4576 synthesizeGLError(GL_INVALID_OPERATION, functionName, "invalid type
for RGB format"); |
| 4577 return false; | 4577 return false; |
| 4578 } | 4578 } |
| 4579 break; | 4579 break; |
| 4580 case GraphicsContext3D::RGBA: | 4580 case GL_RGBA: |
| 4581 if (type != GraphicsContext3D::UNSIGNED_BYTE | 4581 if (type != GL_UNSIGNED_BYTE |
| 4582 && type != GraphicsContext3D::UNSIGNED_SHORT_4_4_4_4 | 4582 && type != GL_UNSIGNED_SHORT_4_4_4_4 |
| 4583 && type != GraphicsContext3D::UNSIGNED_SHORT_5_5_5_1 | 4583 && type != GL_UNSIGNED_SHORT_5_5_5_1 |
| 4584 && type != GraphicsContext3D::FLOAT | 4584 && type != GL_FLOAT |
| 4585 && type != GraphicsContext3D::HALF_FLOAT_OES) { | 4585 && type != GL_HALF_FLOAT_OES) { |
| 4586 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName
, "invalid type for RGBA format"); | 4586 synthesizeGLError(GL_INVALID_OPERATION, functionName, "invalid type
for RGBA format"); |
| 4587 return false; | 4587 return false; |
| 4588 } | 4588 } |
| 4589 break; | 4589 break; |
| 4590 case GraphicsContext3D::DEPTH_COMPONENT: | 4590 case GL_DEPTH_COMPONENT: |
| 4591 if (!m_webglDepthTexture) { | 4591 if (!m_webglDepthTexture) { |
| 4592 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "in
valid format. DEPTH_COMPONENT not enabled"); | 4592 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid format. DE
PTH_COMPONENT not enabled"); |
| 4593 return false; | 4593 return false; |
| 4594 } | 4594 } |
| 4595 if (type != GraphicsContext3D::UNSIGNED_SHORT | 4595 if (type != GL_UNSIGNED_SHORT |
| 4596 && type != GraphicsContext3D::UNSIGNED_INT) { | 4596 && type != GL_UNSIGNED_INT) { |
| 4597 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName
, "invalid type for DEPTH_COMPONENT format"); | 4597 synthesizeGLError(GL_INVALID_OPERATION, functionName, "invalid type
for DEPTH_COMPONENT format"); |
| 4598 return false; | 4598 return false; |
| 4599 } | 4599 } |
| 4600 if (level > 0) { | 4600 if (level > 0) { |
| 4601 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName,
"level must be 0 for DEPTH_COMPONENT format"); | 4601 synthesizeGLError(GL_INVALID_OPERATION, functionName, "level must be
0 for DEPTH_COMPONENT format"); |
| 4602 return false; | 4602 return false; |
| 4603 } | 4603 } |
| 4604 break; | 4604 break; |
| 4605 case GraphicsContext3D::DEPTH_STENCIL: | 4605 case GL_DEPTH_STENCIL_OES: |
| 4606 if (!m_webglDepthTexture) { | 4606 if (!m_webglDepthTexture) { |
| 4607 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "in
valid format. DEPTH_STENCIL not enabled"); | 4607 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid format. DE
PTH_STENCIL not enabled"); |
| 4608 return false; | 4608 return false; |
| 4609 } | 4609 } |
| 4610 if (type != GraphicsContext3D::UNSIGNED_INT_24_8) { | 4610 if (type != GL_UNSIGNED_INT_24_8_OES) { |
| 4611 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName
, "invalid type for DEPTH_STENCIL format"); | 4611 synthesizeGLError(GL_INVALID_OPERATION, functionName, "invalid type
for DEPTH_STENCIL format"); |
| 4612 return false; | 4612 return false; |
| 4613 } | 4613 } |
| 4614 if (level > 0) { | 4614 if (level > 0) { |
| 4615 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName,
"level must be 0 for DEPTH_STENCIL format"); | 4615 synthesizeGLError(GL_INVALID_OPERATION, functionName, "level must be
0 for DEPTH_STENCIL format"); |
| 4616 return false; | 4616 return false; |
| 4617 } | 4617 } |
| 4618 break; | 4618 break; |
| 4619 default: | 4619 default: |
| 4620 ASSERT_NOT_REACHED(); | 4620 ASSERT_NOT_REACHED(); |
| 4621 } | 4621 } |
| 4622 | 4622 |
| 4623 return true; | 4623 return true; |
| 4624 } | 4624 } |
| 4625 | 4625 |
| 4626 bool WebGLRenderingContext::validateTexFuncLevel(const char* functionName, GC3De
num target, GC3Dint level) | 4626 bool WebGLRenderingContext::validateTexFuncLevel(const char* functionName, GC3De
num target, GC3Dint level) |
| 4627 { | 4627 { |
| 4628 if (level < 0) { | 4628 if (level < 0) { |
| 4629 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "level
< 0"); | 4629 synthesizeGLError(GL_INVALID_VALUE, functionName, "level < 0"); |
| 4630 return false; | 4630 return false; |
| 4631 } | 4631 } |
| 4632 switch (target) { | 4632 switch (target) { |
| 4633 case GraphicsContext3D::TEXTURE_2D: | 4633 case GL_TEXTURE_2D: |
| 4634 if (level >= m_maxTextureLevel) { | 4634 if (level >= m_maxTextureLevel) { |
| 4635 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "l
evel out of range"); | 4635 synthesizeGLError(GL_INVALID_VALUE, functionName, "level out of rang
e"); |
| 4636 return false; | 4636 return false; |
| 4637 } | 4637 } |
| 4638 break; | 4638 break; |
| 4639 case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_X: | 4639 case GL_TEXTURE_CUBE_MAP_POSITIVE_X: |
| 4640 case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_X: | 4640 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: |
| 4641 case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Y: | 4641 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: |
| 4642 case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Y: | 4642 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: |
| 4643 case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Z: | 4643 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: |
| 4644 case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Z: | 4644 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: |
| 4645 if (level >= m_maxCubeMapTextureLevel) { | 4645 if (level >= m_maxCubeMapTextureLevel) { |
| 4646 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "l
evel out of range"); | 4646 synthesizeGLError(GL_INVALID_VALUE, functionName, "level out of rang
e"); |
| 4647 return false; | 4647 return false; |
| 4648 } | 4648 } |
| 4649 break; | 4649 break; |
| 4650 } | 4650 } |
| 4651 // This function only checks if level is legal, so we return true and don't | 4651 // This function only checks if level is legal, so we return true and don't |
| 4652 // generate INVALID_ENUM if target is illegal. | 4652 // generate INVALID_ENUM if target is illegal. |
| 4653 return true; | 4653 return true; |
| 4654 } | 4654 } |
| 4655 | 4655 |
| 4656 bool WebGLRenderingContext::validateTexFuncDimensions(const char* functionName,
TexFuncValidationFunctionType functionType, | 4656 bool WebGLRenderingContext::validateTexFuncDimensions(const char* functionName,
TexFuncValidationFunctionType functionType, |
| 4657 GC3Denum target, GC3Dint level, GC3Dsizei width, GC3Dsizei height) | 4657 GC3Denum target, GC3Dint level, GC3Dsizei width, GC3Dsizei height) |
| 4658 { | 4658 { |
| 4659 if (width < 0 || height < 0) { | 4659 if (width < 0 || height < 0) { |
| 4660 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "width
or height < 0"); | 4660 synthesizeGLError(GL_INVALID_VALUE, functionName, "width or height < 0")
; |
| 4661 return false; | 4661 return false; |
| 4662 } | 4662 } |
| 4663 | 4663 |
| 4664 switch (target) { | 4664 switch (target) { |
| 4665 case GraphicsContext3D::TEXTURE_2D: | 4665 case GL_TEXTURE_2D: |
| 4666 if (width > (m_maxTextureSize >> level) || height > (m_maxTextureSize >>
level)) { | 4666 if (width > (m_maxTextureSize >> level) || height > (m_maxTextureSize >>
level)) { |
| 4667 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "w
idth or height out of range"); | 4667 synthesizeGLError(GL_INVALID_VALUE, functionName, "width or height o
ut of range"); |
| 4668 return false; | 4668 return false; |
| 4669 } | 4669 } |
| 4670 break; | 4670 break; |
| 4671 case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_X: | 4671 case GL_TEXTURE_CUBE_MAP_POSITIVE_X: |
| 4672 case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_X: | 4672 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: |
| 4673 case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Y: | 4673 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: |
| 4674 case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Y: | 4674 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: |
| 4675 case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Z: | 4675 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: |
| 4676 case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Z: | 4676 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: |
| 4677 if (functionType != TexSubImage2D && width != height) { | 4677 if (functionType != TexSubImage2D && width != height) { |
| 4678 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "wid
th != height for cube map"); | 4678 synthesizeGLError(GL_INVALID_VALUE, functionName, "width != height f
or cube map"); |
| 4679 return false; | 4679 return false; |
| 4680 } | 4680 } |
| 4681 // No need to check height here. For texImage width == height. | 4681 // No need to check height here. For texImage width == height. |
| 4682 // For texSubImage that will be checked when checking yoffset + height i
s in range. | 4682 // For texSubImage that will be checked when checking yoffset + height i
s in range. |
| 4683 if (width > (m_maxCubeMapTextureSize >> level)) { | 4683 if (width > (m_maxCubeMapTextureSize >> level)) { |
| 4684 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "w
idth or height out of range for cube map"); | 4684 synthesizeGLError(GL_INVALID_VALUE, functionName, "width or height o
ut of range for cube map"); |
| 4685 return false; | 4685 return false; |
| 4686 } | 4686 } |
| 4687 break; | 4687 break; |
| 4688 default: | 4688 default: |
| 4689 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "invali
d target"); | 4689 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid target"); |
| 4690 return false; | 4690 return false; |
| 4691 } | 4691 } |
| 4692 return true; | 4692 return true; |
| 4693 } | 4693 } |
| 4694 | 4694 |
| 4695 bool WebGLRenderingContext::validateTexFuncParameters(const char* functionName,
TexFuncValidationFunctionType functionType, GC3Denum target, | 4695 bool WebGLRenderingContext::validateTexFuncParameters(const char* functionName,
TexFuncValidationFunctionType functionType, GC3Denum target, |
| 4696 GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, G
C3Dint border, GC3Denum format, GC3Denum type) | 4696 GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, G
C3Dint border, GC3Denum format, GC3Denum type) |
| 4697 { | 4697 { |
| 4698 // We absolutely have to validate the format and type combination. | 4698 // We absolutely have to validate the format and type combination. |
| 4699 // The texImage2D entry points taking HTMLImage, etc. will produce | 4699 // The texImage2D entry points taking HTMLImage, etc. will produce |
| 4700 // temporary data based on this combination, so it must be legal. | 4700 // temporary data based on this combination, so it must be legal. |
| 4701 if (!validateTexFuncFormatAndType(functionName, format, type, level) || !val
idateTexFuncLevel(functionName, target, level)) | 4701 if (!validateTexFuncFormatAndType(functionName, format, type, level) || !val
idateTexFuncLevel(functionName, target, level)) |
| 4702 return false; | 4702 return false; |
| 4703 | 4703 |
| 4704 if (!validateTexFuncDimensions(functionName, functionType, target, level, wi
dth, height)) | 4704 if (!validateTexFuncDimensions(functionName, functionType, target, level, wi
dth, height)) |
| 4705 return false; | 4705 return false; |
| 4706 | 4706 |
| 4707 if (format != internalformat) { | 4707 if (format != internalformat) { |
| 4708 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, "f
ormat != internalformat"); | 4708 synthesizeGLError(GL_INVALID_OPERATION, functionName, "format != interna
lformat"); |
| 4709 return false; | 4709 return false; |
| 4710 } | 4710 } |
| 4711 | 4711 |
| 4712 if (border) { | 4712 if (border) { |
| 4713 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "borde
r != 0"); | 4713 synthesizeGLError(GL_INVALID_VALUE, functionName, "border != 0"); |
| 4714 return false; | 4714 return false; |
| 4715 } | 4715 } |
| 4716 | 4716 |
| 4717 return true; | 4717 return true; |
| 4718 } | 4718 } |
| 4719 | 4719 |
| 4720 bool WebGLRenderingContext::validateTexFuncData(const char* functionName, GC3Din
t level, | 4720 bool WebGLRenderingContext::validateTexFuncData(const char* functionName, GC3Din
t level, |
| 4721 GC3Dsizei width, GC3Dsizei heigh
t, | 4721 GC3Dsizei width, GC3Dsizei heigh
t, |
| 4722 GC3Denum format, GC3Denum type, | 4722 GC3Denum format, GC3Denum type, |
| 4723 ArrayBufferView* pixels, | 4723 ArrayBufferView* pixels, |
| 4724 NullDisposition disposition) | 4724 NullDisposition disposition) |
| 4725 { | 4725 { |
| 4726 // All calling functions check isContextLost, so a duplicate check is not ne
eded here. | 4726 // All calling functions check isContextLost, so a duplicate check is not ne
eded here. |
| 4727 if (!pixels) { | 4727 if (!pixels) { |
| 4728 if (disposition == NullAllowed) | 4728 if (disposition == NullAllowed) |
| 4729 return true; | 4729 return true; |
| 4730 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "no pi
xels"); | 4730 synthesizeGLError(GL_INVALID_VALUE, functionName, "no pixels"); |
| 4731 return false; | 4731 return false; |
| 4732 } | 4732 } |
| 4733 | 4733 |
| 4734 if (!validateTexFuncFormatAndType(functionName, format, type, level)) | 4734 if (!validateTexFuncFormatAndType(functionName, format, type, level)) |
| 4735 return false; | 4735 return false; |
| 4736 if (!validateSettableTexFormat(functionName, format)) | 4736 if (!validateSettableTexFormat(functionName, format)) |
| 4737 return false; | 4737 return false; |
| 4738 | 4738 |
| 4739 switch (type) { | 4739 switch (type) { |
| 4740 case GraphicsContext3D::UNSIGNED_BYTE: | 4740 case GL_UNSIGNED_BYTE: |
| 4741 if (pixels->getType() != ArrayBufferView::TypeUint8) { | 4741 if (pixels->getType() != ArrayBufferView::TypeUint8) { |
| 4742 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName
, "type UNSIGNED_BYTE but ArrayBufferView not Uint8Array"); | 4742 synthesizeGLError(GL_INVALID_OPERATION, functionName, "type UNSIGNED
_BYTE but ArrayBufferView not Uint8Array"); |
| 4743 return false; | 4743 return false; |
| 4744 } | 4744 } |
| 4745 break; | 4745 break; |
| 4746 case GraphicsContext3D::UNSIGNED_SHORT_5_6_5: | 4746 case GL_UNSIGNED_SHORT_5_6_5: |
| 4747 case GraphicsContext3D::UNSIGNED_SHORT_4_4_4_4: | 4747 case GL_UNSIGNED_SHORT_4_4_4_4: |
| 4748 case GraphicsContext3D::UNSIGNED_SHORT_5_5_5_1: | 4748 case GL_UNSIGNED_SHORT_5_5_5_1: |
| 4749 if (pixels->getType() != ArrayBufferView::TypeUint16) { | 4749 if (pixels->getType() != ArrayBufferView::TypeUint16) { |
| 4750 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName
, "type UNSIGNED_SHORT but ArrayBufferView not Uint16Array"); | 4750 synthesizeGLError(GL_INVALID_OPERATION, functionName, "type UNSIGNED
_SHORT but ArrayBufferView not Uint16Array"); |
| 4751 return false; | 4751 return false; |
| 4752 } | 4752 } |
| 4753 break; | 4753 break; |
| 4754 case GraphicsContext3D::FLOAT: // OES_texture_float | 4754 case GL_FLOAT: // OES_texture_float |
| 4755 if (pixels->getType() != ArrayBufferView::TypeFloat32) { | 4755 if (pixels->getType() != ArrayBufferView::TypeFloat32) { |
| 4756 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName
, "type FLOAT but ArrayBufferView not Float32Array"); | 4756 synthesizeGLError(GL_INVALID_OPERATION, functionName, "type FLOAT bu
t ArrayBufferView not Float32Array"); |
| 4757 return false; | 4757 return false; |
| 4758 } | 4758 } |
| 4759 break; | 4759 break; |
| 4760 case GraphicsContext3D::HALF_FLOAT_OES: // OES_texture_half_float | 4760 case GL_HALF_FLOAT_OES: // OES_texture_half_float |
| 4761 // As per the specification, ArrayBufferView should be null when | 4761 // As per the specification, ArrayBufferView should be null when |
| 4762 // OES_texture_half_float is enabled. | 4762 // OES_texture_half_float is enabled. |
| 4763 if (pixels) { | 4763 if (pixels) { |
| 4764 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName
, "type HALF_FLOAT_OES but ArrayBufferView is not NULL"); | 4764 synthesizeGLError(GL_INVALID_OPERATION, functionName, "type HALF_FLO
AT_OES but ArrayBufferView is not NULL"); |
| 4765 return false; | 4765 return false; |
| 4766 } | 4766 } |
| 4767 break; | 4767 break; |
| 4768 default: | 4768 default: |
| 4769 ASSERT_NOT_REACHED(); | 4769 ASSERT_NOT_REACHED(); |
| 4770 } | 4770 } |
| 4771 | 4771 |
| 4772 unsigned int totalBytesRequired; | 4772 unsigned int totalBytesRequired; |
| 4773 GC3Denum error = m_context->computeImageSizeInBytes(format, type, width, hei
ght, m_unpackAlignment, &totalBytesRequired, 0); | 4773 GC3Denum error = m_context->computeImageSizeInBytes(format, type, width, hei
ght, m_unpackAlignment, &totalBytesRequired, 0); |
| 4774 if (error != GraphicsContext3D::NO_ERROR) { | 4774 if (error != GL_NO_ERROR) { |
| 4775 synthesizeGLError(error, functionName, "invalid texture dimensions"); | 4775 synthesizeGLError(error, functionName, "invalid texture dimensions"); |
| 4776 return false; | 4776 return false; |
| 4777 } | 4777 } |
| 4778 if (pixels->byteLength() < totalBytesRequired) { | 4778 if (pixels->byteLength() < totalBytesRequired) { |
| 4779 if (m_unpackAlignment != 1) { | 4779 if (m_unpackAlignment != 1) { |
| 4780 error = m_context->computeImageSizeInBytes(format, type, width, height
, 1, &totalBytesRequired, 0); | 4780 error = m_context->computeImageSizeInBytes(format, type, width, height
, 1, &totalBytesRequired, 0); |
| 4781 if (pixels->byteLength() == totalBytesRequired) { | 4781 if (pixels->byteLength() == totalBytesRequired) { |
| 4782 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName
, "ArrayBufferView not big enough for request with UNPACK_ALIGNMENT > 1"); | 4782 synthesizeGLError(GL_INVALID_OPERATION, functionName, "ArrayBufferVi
ew not big enough for request with UNPACK_ALIGNMENT > 1"); |
| 4783 return false; | 4783 return false; |
| 4784 } | 4784 } |
| 4785 } | 4785 } |
| 4786 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, "A
rrayBufferView not big enough for request"); | 4786 synthesizeGLError(GL_INVALID_OPERATION, functionName, "ArrayBufferView n
ot big enough for request"); |
| 4787 return false; | 4787 return false; |
| 4788 } | 4788 } |
| 4789 return true; | 4789 return true; |
| 4790 } | 4790 } |
| 4791 | 4791 |
| 4792 bool WebGLRenderingContext::validateCompressedTexFormat(GC3Denum format) | 4792 bool WebGLRenderingContext::validateCompressedTexFormat(GC3Denum format) |
| 4793 { | 4793 { |
| 4794 return m_compressedTextureFormats.contains(format); | 4794 return m_compressedTextureFormats.contains(format); |
| 4795 } | 4795 } |
| 4796 | 4796 |
| 4797 bool WebGLRenderingContext::validateCompressedTexFuncData(const char* functionNa
me, | 4797 bool WebGLRenderingContext::validateCompressedTexFuncData(const char* functionNa
me, |
| 4798 GC3Dsizei width, GC3Ds
izei height, | 4798 GC3Dsizei width, GC3Ds
izei height, |
| 4799 GC3Denum format, Array
BufferView* pixels) | 4799 GC3Denum format, Array
BufferView* pixels) |
| 4800 { | 4800 { |
| 4801 if (!pixels) { | 4801 if (!pixels) { |
| 4802 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "no pi
xels"); | 4802 synthesizeGLError(GL_INVALID_VALUE, functionName, "no pixels"); |
| 4803 return false; | 4803 return false; |
| 4804 } | 4804 } |
| 4805 if (width < 0 || height < 0) { | 4805 if (width < 0 || height < 0) { |
| 4806 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "width
or height < 0"); | 4806 synthesizeGLError(GL_INVALID_VALUE, functionName, "width or height < 0")
; |
| 4807 return false; | 4807 return false; |
| 4808 } | 4808 } |
| 4809 | 4809 |
| 4810 unsigned int bytesRequired = 0; | 4810 unsigned int bytesRequired = 0; |
| 4811 | 4811 |
| 4812 switch (format) { | 4812 switch (format) { |
| 4813 case Extensions3D::COMPRESSED_RGB_S3TC_DXT1_EXT: | 4813 case Extensions3D::COMPRESSED_RGB_S3TC_DXT1_EXT: |
| 4814 case Extensions3D::COMPRESSED_RGBA_S3TC_DXT1_EXT: | 4814 case Extensions3D::COMPRESSED_RGBA_S3TC_DXT1_EXT: |
| 4815 { | 4815 { |
| 4816 const int kBlockWidth = 4; | 4816 const int kBlockWidth = 4; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4850 bytesRequired = max(width, 8) * max(height, 8) / 2; | 4850 bytesRequired = max(width, 8) * max(height, 8) / 2; |
| 4851 } | 4851 } |
| 4852 break; | 4852 break; |
| 4853 case Extensions3D::COMPRESSED_RGB_PVRTC_2BPPV1_IMG: | 4853 case Extensions3D::COMPRESSED_RGB_PVRTC_2BPPV1_IMG: |
| 4854 case Extensions3D::COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: | 4854 case Extensions3D::COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: |
| 4855 { | 4855 { |
| 4856 bytesRequired = max(width, 8) * max(height, 8) / 4; | 4856 bytesRequired = max(width, 8) * max(height, 8) / 4; |
| 4857 } | 4857 } |
| 4858 break; | 4858 break; |
| 4859 default: | 4859 default: |
| 4860 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "invali
d format"); | 4860 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid format"); |
| 4861 return false; | 4861 return false; |
| 4862 } | 4862 } |
| 4863 | 4863 |
| 4864 if (pixels->byteLength() != bytesRequired) { | 4864 if (pixels->byteLength() != bytesRequired) { |
| 4865 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "lengt
h of ArrayBufferView is not correct for dimensions"); | 4865 synthesizeGLError(GL_INVALID_VALUE, functionName, "length of ArrayBuffer
View is not correct for dimensions"); |
| 4866 return false; | 4866 return false; |
| 4867 } | 4867 } |
| 4868 | 4868 |
| 4869 return true; | 4869 return true; |
| 4870 } | 4870 } |
| 4871 | 4871 |
| 4872 bool WebGLRenderingContext::validateCompressedTexDimensions(const char* function
Name, TexFuncValidationFunctionType functionType, GC3Denum target, GC3Dint level
, GC3Dsizei width, GC3Dsizei height, GC3Denum format) | 4872 bool WebGLRenderingContext::validateCompressedTexDimensions(const char* function
Name, TexFuncValidationFunctionType functionType, GC3Denum target, GC3Dint level
, GC3Dsizei width, GC3Dsizei height, GC3Denum format) |
| 4873 { | 4873 { |
| 4874 if (!validateTexFuncDimensions(functionName, functionType, target, level, wi
dth, height)) | 4874 if (!validateTexFuncDimensions(functionName, functionType, target, level, wi
dth, height)) |
| 4875 return false; | 4875 return false; |
| 4876 | 4876 |
| 4877 switch (format) { | 4877 switch (format) { |
| 4878 case Extensions3D::COMPRESSED_RGB_S3TC_DXT1_EXT: | 4878 case Extensions3D::COMPRESSED_RGB_S3TC_DXT1_EXT: |
| 4879 case Extensions3D::COMPRESSED_RGBA_S3TC_DXT1_EXT: | 4879 case Extensions3D::COMPRESSED_RGBA_S3TC_DXT1_EXT: |
| 4880 case Extensions3D::COMPRESSED_RGBA_S3TC_DXT3_EXT: | 4880 case Extensions3D::COMPRESSED_RGBA_S3TC_DXT3_EXT: |
| 4881 case Extensions3D::COMPRESSED_RGBA_S3TC_DXT5_EXT: { | 4881 case Extensions3D::COMPRESSED_RGBA_S3TC_DXT5_EXT: { |
| 4882 const int kBlockWidth = 4; | 4882 const int kBlockWidth = 4; |
| 4883 const int kBlockHeight = 4; | 4883 const int kBlockHeight = 4; |
| 4884 bool widthValid = (level && width == 1) || (level && width == 2) || !(wi
dth % kBlockWidth); | 4884 bool widthValid = (level && width == 1) || (level && width == 2) || !(wi
dth % kBlockWidth); |
| 4885 bool heightValid = (level && height == 1) || (level && height == 2) || !
(height % kBlockHeight); | 4885 bool heightValid = (level && height == 1) || (level && height == 2) || !
(height % kBlockHeight); |
| 4886 if (!widthValid || !heightValid) { | 4886 if (!widthValid || !heightValid) { |
| 4887 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName,
"width or height invalid for level"); | 4887 synthesizeGLError(GL_INVALID_OPERATION, functionName, "width or heig
ht invalid for level"); |
| 4888 return false; | 4888 return false; |
| 4889 } | 4889 } |
| 4890 return true; | 4890 return true; |
| 4891 } | 4891 } |
| 4892 default: | 4892 default: |
| 4893 return false; | 4893 return false; |
| 4894 } | 4894 } |
| 4895 } | 4895 } |
| 4896 | 4896 |
| 4897 bool WebGLRenderingContext::validateCompressedTexSubDimensions(const char* funct
ionName, GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, | 4897 bool WebGLRenderingContext::validateCompressedTexSubDimensions(const char* funct
ionName, GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, |
| 4898 GC3Dsizei width,
GC3Dsizei height, GC3Denum format, WebGLTexture* tex) | 4898 GC3Dsizei width,
GC3Dsizei height, GC3Denum format, WebGLTexture* tex) |
| 4899 { | 4899 { |
| 4900 if (xoffset < 0 || yoffset < 0) { | 4900 if (xoffset < 0 || yoffset < 0) { |
| 4901 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "xoffset
or yoffset < 0"); | 4901 synthesizeGLError(GL_INVALID_VALUE, functionName, "xoffset or yoffset <
0"); |
| 4902 return false; | 4902 return false; |
| 4903 } | 4903 } |
| 4904 | 4904 |
| 4905 switch (format) { | 4905 switch (format) { |
| 4906 case Extensions3D::COMPRESSED_RGB_S3TC_DXT1_EXT: | 4906 case Extensions3D::COMPRESSED_RGB_S3TC_DXT1_EXT: |
| 4907 case Extensions3D::COMPRESSED_RGBA_S3TC_DXT1_EXT: | 4907 case Extensions3D::COMPRESSED_RGBA_S3TC_DXT1_EXT: |
| 4908 case Extensions3D::COMPRESSED_RGBA_S3TC_DXT3_EXT: | 4908 case Extensions3D::COMPRESSED_RGBA_S3TC_DXT3_EXT: |
| 4909 case Extensions3D::COMPRESSED_RGBA_S3TC_DXT5_EXT: { | 4909 case Extensions3D::COMPRESSED_RGBA_S3TC_DXT5_EXT: { |
| 4910 const int kBlockWidth = 4; | 4910 const int kBlockWidth = 4; |
| 4911 const int kBlockHeight = 4; | 4911 const int kBlockHeight = 4; |
| 4912 if ((xoffset % kBlockWidth) || (yoffset % kBlockHeight)) { | 4912 if ((xoffset % kBlockWidth) || (yoffset % kBlockHeight)) { |
| 4913 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName
, "xoffset or yoffset not multiple of 4"); | 4913 synthesizeGLError(GL_INVALID_OPERATION, functionName, "xoffset or yo
ffset not multiple of 4"); |
| 4914 return false; | 4914 return false; |
| 4915 } | 4915 } |
| 4916 if (width - xoffset > tex->getWidth(target, level) | 4916 if (width - xoffset > tex->getWidth(target, level) |
| 4917 || height - yoffset > tex->getHeight(target, level)) { | 4917 || height - yoffset > tex->getHeight(target, level)) { |
| 4918 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName
, "dimensions out of range"); | 4918 synthesizeGLError(GL_INVALID_OPERATION, functionName, "dimensions ou
t of range"); |
| 4919 return false; | 4919 return false; |
| 4920 } | 4920 } |
| 4921 return validateCompressedTexDimensions(functionName, TexSubImage2D, targ
et, level, width, height, format); | 4921 return validateCompressedTexDimensions(functionName, TexSubImage2D, targ
et, level, width, height, format); |
| 4922 } | 4922 } |
| 4923 default: | 4923 default: |
| 4924 return false; | 4924 return false; |
| 4925 } | 4925 } |
| 4926 } | 4926 } |
| 4927 | 4927 |
| 4928 bool WebGLRenderingContext::validateDrawMode(const char* functionName, GC3Denum
mode) | 4928 bool WebGLRenderingContext::validateDrawMode(const char* functionName, GC3Denum
mode) |
| 4929 { | 4929 { |
| 4930 switch (mode) { | 4930 switch (mode) { |
| 4931 case GraphicsContext3D::POINTS: | 4931 case GL_POINTS: |
| 4932 case GraphicsContext3D::LINE_STRIP: | 4932 case GL_LINE_STRIP: |
| 4933 case GraphicsContext3D::LINE_LOOP: | 4933 case GL_LINE_LOOP: |
| 4934 case GraphicsContext3D::LINES: | 4934 case GL_LINES: |
| 4935 case GraphicsContext3D::TRIANGLE_STRIP: | 4935 case GL_TRIANGLE_STRIP: |
| 4936 case GraphicsContext3D::TRIANGLE_FAN: | 4936 case GL_TRIANGLE_FAN: |
| 4937 case GraphicsContext3D::TRIANGLES: | 4937 case GL_TRIANGLES: |
| 4938 return true; | 4938 return true; |
| 4939 default: | 4939 default: |
| 4940 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "invali
d draw mode"); | 4940 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid draw mode"); |
| 4941 return false; | 4941 return false; |
| 4942 } | 4942 } |
| 4943 } | 4943 } |
| 4944 | 4944 |
| 4945 bool WebGLRenderingContext::validateStencilSettings(const char* functionName) | 4945 bool WebGLRenderingContext::validateStencilSettings(const char* functionName) |
| 4946 { | 4946 { |
| 4947 if (m_stencilMask != m_stencilMaskBack || m_stencilFuncRef != m_stencilFuncR
efBack || m_stencilFuncMask != m_stencilFuncMaskBack) { | 4947 if (m_stencilMask != m_stencilMaskBack || m_stencilFuncRef != m_stencilFuncR
efBack || m_stencilFuncMask != m_stencilFuncMaskBack) { |
| 4948 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, "f
ront and back stencils settings do not match"); | 4948 synthesizeGLError(GL_INVALID_OPERATION, functionName, "front and back st
encils settings do not match"); |
| 4949 return false; | 4949 return false; |
| 4950 } | 4950 } |
| 4951 return true; | 4951 return true; |
| 4952 } | 4952 } |
| 4953 | 4953 |
| 4954 bool WebGLRenderingContext::validateStencilOrDepthFunc(const char* functionName,
GC3Denum func) | 4954 bool WebGLRenderingContext::validateStencilOrDepthFunc(const char* functionName,
GC3Denum func) |
| 4955 { | 4955 { |
| 4956 switch (func) { | 4956 switch (func) { |
| 4957 case GraphicsContext3D::NEVER: | 4957 case GL_NEVER: |
| 4958 case GraphicsContext3D::LESS: | 4958 case GL_LESS: |
| 4959 case GraphicsContext3D::LEQUAL: | 4959 case GL_LEQUAL: |
| 4960 case GraphicsContext3D::GREATER: | 4960 case GL_GREATER: |
| 4961 case GraphicsContext3D::GEQUAL: | 4961 case GL_GEQUAL: |
| 4962 case GraphicsContext3D::EQUAL: | 4962 case GL_EQUAL: |
| 4963 case GraphicsContext3D::NOTEQUAL: | 4963 case GL_NOTEQUAL: |
| 4964 case GraphicsContext3D::ALWAYS: | 4964 case GL_ALWAYS: |
| 4965 return true; | 4965 return true; |
| 4966 default: | 4966 default: |
| 4967 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "invali
d function"); | 4967 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid function"); |
| 4968 return false; | 4968 return false; |
| 4969 } | 4969 } |
| 4970 } | 4970 } |
| 4971 | 4971 |
| 4972 void WebGLRenderingContext::printGLErrorToConsole(const String& message) | 4972 void WebGLRenderingContext::printGLErrorToConsole(const String& message) |
| 4973 { | 4973 { |
| 4974 if (!m_numGLErrorsToConsoleAllowed) | 4974 if (!m_numGLErrorsToConsoleAllowed) |
| 4975 return; | 4975 return; |
| 4976 | 4976 |
| 4977 --m_numGLErrorsToConsoleAllowed; | 4977 --m_numGLErrorsToConsoleAllowed; |
| 4978 printWarningToConsole(message); | 4978 printWarningToConsole(message); |
| 4979 | 4979 |
| 4980 if (!m_numGLErrorsToConsoleAllowed) | 4980 if (!m_numGLErrorsToConsoleAllowed) |
| 4981 printWarningToConsole("WebGL: too many errors, no more errors will be re
ported to the console for this context."); | 4981 printWarningToConsole("WebGL: too many errors, no more errors will be re
ported to the console for this context."); |
| 4982 | 4982 |
| 4983 return; | 4983 return; |
| 4984 } | 4984 } |
| 4985 | 4985 |
| 4986 void WebGLRenderingContext::printWarningToConsole(const String& message) | 4986 void WebGLRenderingContext::printWarningToConsole(const String& message) |
| 4987 { | 4987 { |
| 4988 if (!canvas()) | 4988 if (!canvas()) |
| 4989 return; | 4989 return; |
| 4990 canvas()->document().addConsoleMessage(RenderingMessageSource, WarningMessag
eLevel, message); | 4990 canvas()->document().addConsoleMessage(RenderingMessageSource, WarningMessag
eLevel, message); |
| 4991 } | 4991 } |
| 4992 | 4992 |
| 4993 bool WebGLRenderingContext::validateFramebufferFuncParameters(const char* functi
onName, GC3Denum target, GC3Denum attachment) | 4993 bool WebGLRenderingContext::validateFramebufferFuncParameters(const char* functi
onName, GC3Denum target, GC3Denum attachment) |
| 4994 { | 4994 { |
| 4995 if (target != GraphicsContext3D::FRAMEBUFFER) { | 4995 if (target != GL_FRAMEBUFFER) { |
| 4996 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "invali
d target"); | 4996 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid target"); |
| 4997 return false; | 4997 return false; |
| 4998 } | 4998 } |
| 4999 switch (attachment) { | 4999 switch (attachment) { |
| 5000 case GraphicsContext3D::COLOR_ATTACHMENT0: | 5000 case GL_COLOR_ATTACHMENT0: |
| 5001 case GraphicsContext3D::DEPTH_ATTACHMENT: | 5001 case GL_DEPTH_ATTACHMENT: |
| 5002 case GraphicsContext3D::STENCIL_ATTACHMENT: | 5002 case GL_STENCIL_ATTACHMENT: |
| 5003 case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT: | 5003 case GC3D_DEPTH_STENCIL_ATTACHMENT: |
| 5004 break; | 5004 break; |
| 5005 default: | 5005 default: |
| 5006 if (m_webglDrawBuffers | 5006 if (m_webglDrawBuffers |
| 5007 && attachment > GraphicsContext3D::COLOR_ATTACHMENT0 | 5007 && attachment > GL_COLOR_ATTACHMENT0 |
| 5008 && attachment < static_cast<GC3Denum>(GraphicsContext3D::COLOR_ATTAC
HMENT0 + maxColorAttachments())) | 5008 && attachment < static_cast<GC3Denum>(GL_COLOR_ATTACHMENT0 + maxColo
rAttachments())) |
| 5009 break; | 5009 break; |
| 5010 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "invali
d attachment"); | 5010 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid attachment"); |
| 5011 return false; | 5011 return false; |
| 5012 } | 5012 } |
| 5013 return true; | 5013 return true; |
| 5014 } | 5014 } |
| 5015 | 5015 |
| 5016 bool WebGLRenderingContext::validateBlendEquation(const char* functionName, GC3D
enum mode) | 5016 bool WebGLRenderingContext::validateBlendEquation(const char* functionName, GC3D
enum mode) |
| 5017 { | 5017 { |
| 5018 switch (mode) { | 5018 switch (mode) { |
| 5019 case GraphicsContext3D::FUNC_ADD: | 5019 case GL_FUNC_ADD: |
| 5020 case GraphicsContext3D::FUNC_SUBTRACT: | 5020 case GL_FUNC_SUBTRACT: |
| 5021 case GraphicsContext3D::FUNC_REVERSE_SUBTRACT: | 5021 case GL_FUNC_REVERSE_SUBTRACT: |
| 5022 return true; | 5022 return true; |
| 5023 default: | 5023 default: |
| 5024 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "invali
d mode"); | 5024 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid mode"); |
| 5025 return false; | 5025 return false; |
| 5026 } | 5026 } |
| 5027 } | 5027 } |
| 5028 | 5028 |
| 5029 bool WebGLRenderingContext::validateBlendFuncFactors(const char* functionName, G
C3Denum src, GC3Denum dst) | 5029 bool WebGLRenderingContext::validateBlendFuncFactors(const char* functionName, G
C3Denum src, GC3Denum dst) |
| 5030 { | 5030 { |
| 5031 if (((src == GraphicsContext3D::CONSTANT_COLOR || src == GraphicsContext3D::
ONE_MINUS_CONSTANT_COLOR) | 5031 if (((src == GL_CONSTANT_COLOR || src == GL_ONE_MINUS_CONSTANT_COLOR) |
| 5032 && (dst == GraphicsContext3D::CONSTANT_ALPHA || dst == GraphicsContext3
D::ONE_MINUS_CONSTANT_ALPHA)) | 5032 && (dst == GL_CONSTANT_ALPHA || dst == GL_ONE_MINUS_CONSTANT_ALPHA)) |
| 5033 || ((dst == GraphicsContext3D::CONSTANT_COLOR || dst == GraphicsContext3
D::ONE_MINUS_CONSTANT_COLOR) | 5033 || ((dst == GL_CONSTANT_COLOR || dst == GL_ONE_MINUS_CONSTANT_COLOR) |
| 5034 && (src == GraphicsContext3D::CONSTANT_ALPHA || src == GraphicsConte
xt3D::ONE_MINUS_CONSTANT_ALPHA))) { | 5034 && (src == GL_CONSTANT_ALPHA || src == GL_ONE_MINUS_CONSTANT_ALPHA))) { |
| 5035 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, "i
ncompatible src and dst"); | 5035 synthesizeGLError(GL_INVALID_OPERATION, functionName, "incompatible src
and dst"); |
| 5036 return false; | 5036 return false; |
| 5037 } | 5037 } |
| 5038 return true; | 5038 return true; |
| 5039 } | 5039 } |
| 5040 | 5040 |
| 5041 bool WebGLRenderingContext::validateCapability(const char* functionName, GC3Denu
m cap) | 5041 bool WebGLRenderingContext::validateCapability(const char* functionName, GC3Denu
m cap) |
| 5042 { | 5042 { |
| 5043 switch (cap) { | 5043 switch (cap) { |
| 5044 case GraphicsContext3D::BLEND: | 5044 case GL_BLEND: |
| 5045 case GraphicsContext3D::CULL_FACE: | 5045 case GL_CULL_FACE: |
| 5046 case GraphicsContext3D::DEPTH_TEST: | 5046 case GL_DEPTH_TEST: |
| 5047 case GraphicsContext3D::DITHER: | 5047 case GL_DITHER: |
| 5048 case GraphicsContext3D::POLYGON_OFFSET_FILL: | 5048 case GL_POLYGON_OFFSET_FILL: |
| 5049 case GraphicsContext3D::SAMPLE_ALPHA_TO_COVERAGE: | 5049 case GL_SAMPLE_ALPHA_TO_COVERAGE: |
| 5050 case GraphicsContext3D::SAMPLE_COVERAGE: | 5050 case GL_SAMPLE_COVERAGE: |
| 5051 case GraphicsContext3D::SCISSOR_TEST: | 5051 case GL_SCISSOR_TEST: |
| 5052 case GraphicsContext3D::STENCIL_TEST: | 5052 case GL_STENCIL_TEST: |
| 5053 return true; | 5053 return true; |
| 5054 default: | 5054 default: |
| 5055 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "invali
d capability"); | 5055 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid capability"); |
| 5056 return false; | 5056 return false; |
| 5057 } | 5057 } |
| 5058 } | 5058 } |
| 5059 | 5059 |
| 5060 bool WebGLRenderingContext::validateUniformParameters(const char* functionName,
const WebGLUniformLocation* location, Float32Array* v, GC3Dsizei requiredMinSize
) | 5060 bool WebGLRenderingContext::validateUniformParameters(const char* functionName,
const WebGLUniformLocation* location, Float32Array* v, GC3Dsizei requiredMinSize
) |
| 5061 { | 5061 { |
| 5062 if (!v) { | 5062 if (!v) { |
| 5063 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "no ar
ray"); | 5063 synthesizeGLError(GL_INVALID_VALUE, functionName, "no array"); |
| 5064 return false; | 5064 return false; |
| 5065 } | 5065 } |
| 5066 return validateUniformMatrixParameters(functionName, location, false, v->dat
a(), v->length(), requiredMinSize); | 5066 return validateUniformMatrixParameters(functionName, location, false, v->dat
a(), v->length(), requiredMinSize); |
| 5067 } | 5067 } |
| 5068 | 5068 |
| 5069 bool WebGLRenderingContext::validateUniformParameters(const char* functionName,
const WebGLUniformLocation* location, Int32Array* v, GC3Dsizei requiredMinSize) | 5069 bool WebGLRenderingContext::validateUniformParameters(const char* functionName,
const WebGLUniformLocation* location, Int32Array* v, GC3Dsizei requiredMinSize) |
| 5070 { | 5070 { |
| 5071 if (!v) { | 5071 if (!v) { |
| 5072 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "no ar
ray"); | 5072 synthesizeGLError(GL_INVALID_VALUE, functionName, "no array"); |
| 5073 return false; | 5073 return false; |
| 5074 } | 5074 } |
| 5075 return validateUniformMatrixParameters(functionName, location, false, v->dat
a(), v->length(), requiredMinSize); | 5075 return validateUniformMatrixParameters(functionName, location, false, v->dat
a(), v->length(), requiredMinSize); |
| 5076 } | 5076 } |
| 5077 | 5077 |
| 5078 bool WebGLRenderingContext::validateUniformParameters(const char* functionName,
const WebGLUniformLocation* location, void* v, GC3Dsizei size, GC3Dsizei require
dMinSize) | 5078 bool WebGLRenderingContext::validateUniformParameters(const char* functionName,
const WebGLUniformLocation* location, void* v, GC3Dsizei size, GC3Dsizei require
dMinSize) |
| 5079 { | 5079 { |
| 5080 return validateUniformMatrixParameters(functionName, location, false, v, siz
e, requiredMinSize); | 5080 return validateUniformMatrixParameters(functionName, location, false, v, siz
e, requiredMinSize); |
| 5081 } | 5081 } |
| 5082 | 5082 |
| 5083 bool WebGLRenderingContext::validateUniformMatrixParameters(const char* function
Name, const WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array*
v, GC3Dsizei requiredMinSize) | 5083 bool WebGLRenderingContext::validateUniformMatrixParameters(const char* function
Name, const WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array*
v, GC3Dsizei requiredMinSize) |
| 5084 { | 5084 { |
| 5085 if (!v) { | 5085 if (!v) { |
| 5086 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "no ar
ray"); | 5086 synthesizeGLError(GL_INVALID_VALUE, functionName, "no array"); |
| 5087 return false; | 5087 return false; |
| 5088 } | 5088 } |
| 5089 return validateUniformMatrixParameters(functionName, location, transpose, v-
>data(), v->length(), requiredMinSize); | 5089 return validateUniformMatrixParameters(functionName, location, transpose, v-
>data(), v->length(), requiredMinSize); |
| 5090 } | 5090 } |
| 5091 | 5091 |
| 5092 bool WebGLRenderingContext::validateUniformMatrixParameters(const char* function
Name, const WebGLUniformLocation* location, GC3Dboolean transpose, void* v, GC3D
sizei size, GC3Dsizei requiredMinSize) | 5092 bool WebGLRenderingContext::validateUniformMatrixParameters(const char* function
Name, const WebGLUniformLocation* location, GC3Dboolean transpose, void* v, GC3D
sizei size, GC3Dsizei requiredMinSize) |
| 5093 { | 5093 { |
| 5094 if (!location) | 5094 if (!location) |
| 5095 return false; | 5095 return false; |
| 5096 if (location->program() != m_currentProgram) { | 5096 if (location->program() != m_currentProgram) { |
| 5097 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, "l
ocation is not from current program"); | 5097 synthesizeGLError(GL_INVALID_OPERATION, functionName, "location is not f
rom current program"); |
| 5098 return false; | 5098 return false; |
| 5099 } | 5099 } |
| 5100 if (!v) { | 5100 if (!v) { |
| 5101 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "no ar
ray"); | 5101 synthesizeGLError(GL_INVALID_VALUE, functionName, "no array"); |
| 5102 return false; | 5102 return false; |
| 5103 } | 5103 } |
| 5104 if (transpose) { | 5104 if (transpose) { |
| 5105 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "trans
pose not FALSE"); | 5105 synthesizeGLError(GL_INVALID_VALUE, functionName, "transpose not FALSE")
; |
| 5106 return false; | 5106 return false; |
| 5107 } | 5107 } |
| 5108 if (size < requiredMinSize || (size % requiredMinSize)) { | 5108 if (size < requiredMinSize || (size % requiredMinSize)) { |
| 5109 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "inval
id size"); | 5109 synthesizeGLError(GL_INVALID_VALUE, functionName, "invalid size"); |
| 5110 return false; | 5110 return false; |
| 5111 } | 5111 } |
| 5112 return true; | 5112 return true; |
| 5113 } | 5113 } |
| 5114 | 5114 |
| 5115 WebGLBuffer* WebGLRenderingContext::validateBufferDataParameters(const char* fun
ctionName, GC3Denum target, GC3Denum usage) | 5115 WebGLBuffer* WebGLRenderingContext::validateBufferDataParameters(const char* fun
ctionName, GC3Denum target, GC3Denum usage) |
| 5116 { | 5116 { |
| 5117 WebGLBuffer* buffer = 0; | 5117 WebGLBuffer* buffer = 0; |
| 5118 switch (target) { | 5118 switch (target) { |
| 5119 case GraphicsContext3D::ELEMENT_ARRAY_BUFFER: | 5119 case GL_ELEMENT_ARRAY_BUFFER: |
| 5120 buffer = m_boundVertexArrayObject->boundElementArrayBuffer().get(); | 5120 buffer = m_boundVertexArrayObject->boundElementArrayBuffer().get(); |
| 5121 break; | 5121 break; |
| 5122 case GraphicsContext3D::ARRAY_BUFFER: | 5122 case GL_ARRAY_BUFFER: |
| 5123 buffer = m_boundArrayBuffer.get(); | 5123 buffer = m_boundArrayBuffer.get(); |
| 5124 break; | 5124 break; |
| 5125 default: | 5125 default: |
| 5126 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "invali
d target"); | 5126 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid target"); |
| 5127 return 0; | 5127 return 0; |
| 5128 } | 5128 } |
| 5129 if (!buffer) { | 5129 if (!buffer) { |
| 5130 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, "n
o buffer"); | 5130 synthesizeGLError(GL_INVALID_OPERATION, functionName, "no buffer"); |
| 5131 return 0; | 5131 return 0; |
| 5132 } | 5132 } |
| 5133 switch (usage) { | 5133 switch (usage) { |
| 5134 case GraphicsContext3D::STREAM_DRAW: | 5134 case GL_STREAM_DRAW: |
| 5135 case GraphicsContext3D::STATIC_DRAW: | 5135 case GL_STATIC_DRAW: |
| 5136 case GraphicsContext3D::DYNAMIC_DRAW: | 5136 case GL_DYNAMIC_DRAW: |
| 5137 return buffer; | 5137 return buffer; |
| 5138 } | 5138 } |
| 5139 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "invalid us
age"); | 5139 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid usage"); |
| 5140 return 0; | 5140 return 0; |
| 5141 } | 5141 } |
| 5142 | 5142 |
| 5143 bool WebGLRenderingContext::validateHTMLImageElement(const char* functionName, H
TMLImageElement* image, ExceptionState& exceptionState) | 5143 bool WebGLRenderingContext::validateHTMLImageElement(const char* functionName, H
TMLImageElement* image, ExceptionState& exceptionState) |
| 5144 { | 5144 { |
| 5145 if (!image || !image->cachedImage()) { | 5145 if (!image || !image->cachedImage()) { |
| 5146 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "no im
age"); | 5146 synthesizeGLError(GL_INVALID_VALUE, functionName, "no image"); |
| 5147 return false; | 5147 return false; |
| 5148 } | 5148 } |
| 5149 const KURL& url = image->cachedImage()->response().url(); | 5149 const KURL& url = image->cachedImage()->response().url(); |
| 5150 if (url.isNull() || url.isEmpty() || !url.isValid()) { | 5150 if (url.isNull() || url.isEmpty() || !url.isValid()) { |
| 5151 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "inval
id image"); | 5151 synthesizeGLError(GL_INVALID_VALUE, functionName, "invalid image"); |
| 5152 return false; | 5152 return false; |
| 5153 } | 5153 } |
| 5154 if (wouldTaintOrigin(image)) { | 5154 if (wouldTaintOrigin(image)) { |
| 5155 exceptionState.throwSecurityError("The cross-origin image at " + url.eli
dedString() + " may not be loaded."); | 5155 exceptionState.throwSecurityError("The cross-origin image at " + url.eli
dedString() + " may not be loaded."); |
| 5156 return false; | 5156 return false; |
| 5157 } | 5157 } |
| 5158 return true; | 5158 return true; |
| 5159 } | 5159 } |
| 5160 | 5160 |
| 5161 bool WebGLRenderingContext::validateHTMLCanvasElement(const char* functionName,
HTMLCanvasElement* canvas, ExceptionState& exceptionState) | 5161 bool WebGLRenderingContext::validateHTMLCanvasElement(const char* functionName,
HTMLCanvasElement* canvas, ExceptionState& exceptionState) |
| 5162 { | 5162 { |
| 5163 if (!canvas || !canvas->buffer()) { | 5163 if (!canvas || !canvas->buffer()) { |
| 5164 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "no ca
nvas"); | 5164 synthesizeGLError(GL_INVALID_VALUE, functionName, "no canvas"); |
| 5165 return false; | 5165 return false; |
| 5166 } | 5166 } |
| 5167 if (wouldTaintOrigin(canvas)) { | 5167 if (wouldTaintOrigin(canvas)) { |
| 5168 exceptionState.throwSecurityError("Tainted canvases may not be loaded.")
; | 5168 exceptionState.throwSecurityError("Tainted canvases may not be loaded.")
; |
| 5169 return false; | 5169 return false; |
| 5170 } | 5170 } |
| 5171 return true; | 5171 return true; |
| 5172 } | 5172 } |
| 5173 | 5173 |
| 5174 bool WebGLRenderingContext::validateHTMLVideoElement(const char* functionName, H
TMLVideoElement* video, ExceptionState& exceptionState) | 5174 bool WebGLRenderingContext::validateHTMLVideoElement(const char* functionName, H
TMLVideoElement* video, ExceptionState& exceptionState) |
| 5175 { | 5175 { |
| 5176 if (!video || !video->videoWidth() || !video->videoHeight()) { | 5176 if (!video || !video->videoWidth() || !video->videoHeight()) { |
| 5177 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "no vi
deo"); | 5177 synthesizeGLError(GL_INVALID_VALUE, functionName, "no video"); |
| 5178 return false; | 5178 return false; |
| 5179 } | 5179 } |
| 5180 if (wouldTaintOrigin(video)) { | 5180 if (wouldTaintOrigin(video)) { |
| 5181 exceptionState.throwSecurityError("The video element contains cross-orig
in data, and may not be loaded."); | 5181 exceptionState.throwSecurityError("The video element contains cross-orig
in data, and may not be loaded."); |
| 5182 return false; | 5182 return false; |
| 5183 } | 5183 } |
| 5184 return true; | 5184 return true; |
| 5185 } | 5185 } |
| 5186 | 5186 |
| 5187 bool WebGLRenderingContext::validateDrawArrays(const char* functionName, GC3Denu
m mode, GC3Dint first, GC3Dsizei count) | 5187 bool WebGLRenderingContext::validateDrawArrays(const char* functionName, GC3Denu
m mode, GC3Dint first, GC3Dsizei count) |
| 5188 { | 5188 { |
| 5189 if (isContextLost() || !validateDrawMode(functionName, mode)) | 5189 if (isContextLost() || !validateDrawMode(functionName, mode)) |
| 5190 return false; | 5190 return false; |
| 5191 | 5191 |
| 5192 if (!validateStencilSettings(functionName)) | 5192 if (!validateStencilSettings(functionName)) |
| 5193 return false; | 5193 return false; |
| 5194 | 5194 |
| 5195 if (first < 0 || count < 0) { | 5195 if (first < 0 || count < 0) { |
| 5196 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "first
or count < 0"); | 5196 synthesizeGLError(GL_INVALID_VALUE, functionName, "first or count < 0"); |
| 5197 return false; | 5197 return false; |
| 5198 } | 5198 } |
| 5199 | 5199 |
| 5200 if (!count) { | 5200 if (!count) { |
| 5201 markContextChanged(); | 5201 markContextChanged(); |
| 5202 return false; | 5202 return false; |
| 5203 } | 5203 } |
| 5204 | 5204 |
| 5205 if (!validateRenderingState()) { | 5205 if (!validateRenderingState()) { |
| 5206 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, "a
ttribs not setup correctly"); | 5206 synthesizeGLError(GL_INVALID_OPERATION, functionName, "attribs not setup
correctly"); |
| 5207 return false; | 5207 return false; |
| 5208 } | 5208 } |
| 5209 | 5209 |
| 5210 const char* reason = "framebuffer incomplete"; | 5210 const char* reason = "framebuffer incomplete"; |
| 5211 if (m_framebufferBinding && !m_framebufferBinding->onAccess(graphicsContext3
D(), &reason)) { | 5211 if (m_framebufferBinding && !m_framebufferBinding->onAccess(graphicsContext3
D(), &reason)) { |
| 5212 synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, func
tionName, reason); | 5212 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason
); |
| 5213 return false; | 5213 return false; |
| 5214 } | 5214 } |
| 5215 | 5215 |
| 5216 return true; | 5216 return true; |
| 5217 } | 5217 } |
| 5218 | 5218 |
| 5219 bool WebGLRenderingContext::validateDrawElements(const char* functionName, GC3De
num mode, GC3Dsizei count, GC3Denum type, long long offset) | 5219 bool WebGLRenderingContext::validateDrawElements(const char* functionName, GC3De
num mode, GC3Dsizei count, GC3Denum type, long long offset) |
| 5220 { | 5220 { |
| 5221 if (isContextLost() || !validateDrawMode(functionName, mode)) | 5221 if (isContextLost() || !validateDrawMode(functionName, mode)) |
| 5222 return false; | 5222 return false; |
| 5223 | 5223 |
| 5224 if (!validateStencilSettings(functionName)) | 5224 if (!validateStencilSettings(functionName)) |
| 5225 return false; | 5225 return false; |
| 5226 | 5226 |
| 5227 switch (type) { | 5227 switch (type) { |
| 5228 case GraphicsContext3D::UNSIGNED_BYTE: | 5228 case GL_UNSIGNED_BYTE: |
| 5229 case GraphicsContext3D::UNSIGNED_SHORT: | 5229 case GL_UNSIGNED_SHORT: |
| 5230 break; | 5230 break; |
| 5231 case GraphicsContext3D::UNSIGNED_INT: | 5231 case GL_UNSIGNED_INT: |
| 5232 if (m_oesElementIndexUint) | 5232 if (m_oesElementIndexUint) |
| 5233 break; | 5233 break; |
| 5234 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "invali
d type"); | 5234 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid type"); |
| 5235 return false; | 5235 return false; |
| 5236 default: | 5236 default: |
| 5237 synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "invali
d type"); | 5237 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid type"); |
| 5238 return false; | 5238 return false; |
| 5239 } | 5239 } |
| 5240 | 5240 |
| 5241 if (count < 0 || offset < 0) { | 5241 if (count < 0 || offset < 0) { |
| 5242 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "count
or offset < 0"); | 5242 synthesizeGLError(GL_INVALID_VALUE, functionName, "count or offset < 0")
; |
| 5243 return false; | 5243 return false; |
| 5244 } | 5244 } |
| 5245 | 5245 |
| 5246 if (!count) { | 5246 if (!count) { |
| 5247 markContextChanged(); | 5247 markContextChanged(); |
| 5248 return false; | 5248 return false; |
| 5249 } | 5249 } |
| 5250 | 5250 |
| 5251 if (!m_boundVertexArrayObject->boundElementArrayBuffer()) { | 5251 if (!m_boundVertexArrayObject->boundElementArrayBuffer()) { |
| 5252 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, "n
o ELEMENT_ARRAY_BUFFER bound"); | 5252 synthesizeGLError(GL_INVALID_OPERATION, functionName, "no ELEMENT_ARRAY_
BUFFER bound"); |
| 5253 return false; | 5253 return false; |
| 5254 } | 5254 } |
| 5255 | 5255 |
| 5256 if (!validateRenderingState()) { | 5256 if (!validateRenderingState()) { |
| 5257 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, "a
ttribs not setup correctly"); | 5257 synthesizeGLError(GL_INVALID_OPERATION, functionName, "attribs not setup
correctly"); |
| 5258 return false; | 5258 return false; |
| 5259 } | 5259 } |
| 5260 | 5260 |
| 5261 const char* reason = "framebuffer incomplete"; | 5261 const char* reason = "framebuffer incomplete"; |
| 5262 if (m_framebufferBinding && !m_framebufferBinding->onAccess(graphicsContext3
D(), &reason)) { | 5262 if (m_framebufferBinding && !m_framebufferBinding->onAccess(graphicsContext3
D(), &reason)) { |
| 5263 synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, func
tionName, reason); | 5263 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason
); |
| 5264 return false; | 5264 return false; |
| 5265 } | 5265 } |
| 5266 | 5266 |
| 5267 return true; | 5267 return true; |
| 5268 } | 5268 } |
| 5269 | 5269 |
| 5270 // Helper function to validate draw*Instanced calls | 5270 // Helper function to validate draw*Instanced calls |
| 5271 bool WebGLRenderingContext::validateDrawInstanced(const char* functionName, GC3D
sizei primcount) | 5271 bool WebGLRenderingContext::validateDrawInstanced(const char* functionName, GC3D
sizei primcount) |
| 5272 { | 5272 { |
| 5273 if (primcount < 0) { | 5273 if (primcount < 0) { |
| 5274 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "primc
ount < 0"); | 5274 synthesizeGLError(GL_INVALID_VALUE, functionName, "primcount < 0"); |
| 5275 return false; | 5275 return false; |
| 5276 } | 5276 } |
| 5277 | 5277 |
| 5278 // Ensure at least one enabled vertex attrib has a divisor of 0. | 5278 // Ensure at least one enabled vertex attrib has a divisor of 0. |
| 5279 for (unsigned i = 0; i < m_onePlusMaxEnabledAttribIndex; ++i) { | 5279 for (unsigned i = 0; i < m_onePlusMaxEnabledAttribIndex; ++i) { |
| 5280 const WebGLVertexArrayObjectOES::VertexAttribState& state = m_boundVerte
xArrayObject->getVertexAttribState(i); | 5280 const WebGLVertexArrayObjectOES::VertexAttribState& state = m_boundVerte
xArrayObject->getVertexAttribState(i); |
| 5281 if (state.enabled && !state.divisor) | 5281 if (state.enabled && !state.divisor) |
| 5282 return true; | 5282 return true; |
| 5283 } | 5283 } |
| 5284 | 5284 |
| 5285 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, "at le
ast one enabled attribute must have a divisor of 0"); | 5285 synthesizeGLError(GL_INVALID_OPERATION, functionName, "at least one enabled
attribute must have a divisor of 0"); |
| 5286 return false; | 5286 return false; |
| 5287 } | 5287 } |
| 5288 | 5288 |
| 5289 void WebGLRenderingContext::vertexAttribfImpl(const char* functionName, GC3Duint
index, GC3Dsizei expectedSize, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2, GC3Dfl
oat v3) | 5289 void WebGLRenderingContext::vertexAttribfImpl(const char* functionName, GC3Duint
index, GC3Dsizei expectedSize, GC3Dfloat v0, GC3Dfloat v1, GC3Dfloat v2, GC3Dfl
oat v3) |
| 5290 { | 5290 { |
| 5291 if (isContextLost()) | 5291 if (isContextLost()) |
| 5292 return; | 5292 return; |
| 5293 if (index >= m_maxVertexAttribs) { | 5293 if (index >= m_maxVertexAttribs) { |
| 5294 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "index
out of range"); | 5294 synthesizeGLError(GL_INVALID_VALUE, functionName, "index out of range"); |
| 5295 return; | 5295 return; |
| 5296 } | 5296 } |
| 5297 // In GL, we skip setting vertexAttrib0 values. | 5297 // In GL, we skip setting vertexAttrib0 values. |
| 5298 switch (expectedSize) { | 5298 switch (expectedSize) { |
| 5299 case 1: | 5299 case 1: |
| 5300 m_context->vertexAttrib1f(index, v0); | 5300 m_context->vertexAttrib1f(index, v0); |
| 5301 break; | 5301 break; |
| 5302 case 2: | 5302 case 2: |
| 5303 m_context->vertexAttrib2f(index, v0, v1); | 5303 m_context->vertexAttrib2f(index, v0, v1); |
| 5304 break; | 5304 break; |
| 5305 case 3: | 5305 case 3: |
| 5306 m_context->vertexAttrib3f(index, v0, v1, v2); | 5306 m_context->vertexAttrib3f(index, v0, v1, v2); |
| 5307 break; | 5307 break; |
| 5308 case 4: | 5308 case 4: |
| 5309 m_context->vertexAttrib4f(index, v0, v1, v2, v3); | 5309 m_context->vertexAttrib4f(index, v0, v1, v2, v3); |
| 5310 break; | 5310 break; |
| 5311 } | 5311 } |
| 5312 VertexAttribValue& attribValue = m_vertexAttribValue[index]; | 5312 VertexAttribValue& attribValue = m_vertexAttribValue[index]; |
| 5313 attribValue.value[0] = v0; | 5313 attribValue.value[0] = v0; |
| 5314 attribValue.value[1] = v1; | 5314 attribValue.value[1] = v1; |
| 5315 attribValue.value[2] = v2; | 5315 attribValue.value[2] = v2; |
| 5316 attribValue.value[3] = v3; | 5316 attribValue.value[3] = v3; |
| 5317 } | 5317 } |
| 5318 | 5318 |
| 5319 void WebGLRenderingContext::vertexAttribfvImpl(const char* functionName, GC3Duin
t index, Float32Array* v, GC3Dsizei expectedSize) | 5319 void WebGLRenderingContext::vertexAttribfvImpl(const char* functionName, GC3Duin
t index, Float32Array* v, GC3Dsizei expectedSize) |
| 5320 { | 5320 { |
| 5321 if (isContextLost()) | 5321 if (isContextLost()) |
| 5322 return; | 5322 return; |
| 5323 if (!v) { | 5323 if (!v) { |
| 5324 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "no ar
ray"); | 5324 synthesizeGLError(GL_INVALID_VALUE, functionName, "no array"); |
| 5325 return; | 5325 return; |
| 5326 } | 5326 } |
| 5327 vertexAttribfvImpl(functionName, index, v->data(), v->length(), expectedSize
); | 5327 vertexAttribfvImpl(functionName, index, v->data(), v->length(), expectedSize
); |
| 5328 } | 5328 } |
| 5329 | 5329 |
| 5330 void WebGLRenderingContext::vertexAttribfvImpl(const char* functionName, GC3Duin
t index, GC3Dfloat* v, GC3Dsizei size, GC3Dsizei expectedSize) | 5330 void WebGLRenderingContext::vertexAttribfvImpl(const char* functionName, GC3Duin
t index, GC3Dfloat* v, GC3Dsizei size, GC3Dsizei expectedSize) |
| 5331 { | 5331 { |
| 5332 if (isContextLost()) | 5332 if (isContextLost()) |
| 5333 return; | 5333 return; |
| 5334 if (!v) { | 5334 if (!v) { |
| 5335 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "no ar
ray"); | 5335 synthesizeGLError(GL_INVALID_VALUE, functionName, "no array"); |
| 5336 return; | 5336 return; |
| 5337 } | 5337 } |
| 5338 if (size < expectedSize) { | 5338 if (size < expectedSize) { |
| 5339 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "inval
id size"); | 5339 synthesizeGLError(GL_INVALID_VALUE, functionName, "invalid size"); |
| 5340 return; | 5340 return; |
| 5341 } | 5341 } |
| 5342 if (index >= m_maxVertexAttribs) { | 5342 if (index >= m_maxVertexAttribs) { |
| 5343 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "index
out of range"); | 5343 synthesizeGLError(GL_INVALID_VALUE, functionName, "index out of range"); |
| 5344 return; | 5344 return; |
| 5345 } | 5345 } |
| 5346 // In GL, we skip setting vertexAttrib0 values. | 5346 // In GL, we skip setting vertexAttrib0 values. |
| 5347 switch (expectedSize) { | 5347 switch (expectedSize) { |
| 5348 case 1: | 5348 case 1: |
| 5349 m_context->vertexAttrib1fv(index, v); | 5349 m_context->vertexAttrib1fv(index, v); |
| 5350 break; | 5350 break; |
| 5351 case 2: | 5351 case 2: |
| 5352 m_context->vertexAttrib2fv(index, v); | 5352 m_context->vertexAttrib2fv(index, v); |
| 5353 break; | 5353 break; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5395 | 5395 |
| 5396 if (!frame->loader().client()->allowWebGL(settings && settings->webGLEnabled
())) | 5396 if (!frame->loader().client()->allowWebGL(settings && settings->webGLEnabled
())) |
| 5397 return; | 5397 return; |
| 5398 | 5398 |
| 5399 // Reset the context attributes back to the requested attributes and re-appl
y restrictions | 5399 // Reset the context attributes back to the requested attributes and re-appl
y restrictions |
| 5400 m_attributes = adjustAttributes(m_requestedAttributes, settings); | 5400 m_attributes = adjustAttributes(m_requestedAttributes, settings); |
| 5401 | 5401 |
| 5402 RefPtr<GraphicsContext3D> context(GraphicsContext3D::create(m_attributes)); | 5402 RefPtr<GraphicsContext3D> context(GraphicsContext3D::create(m_attributes)); |
| 5403 | 5403 |
| 5404 if (!context) { | 5404 if (!context) { |
| 5405 if (m_contextLostMode == RealLostContext) | 5405 if (m_contextLostMode == RealLostContext) { |
| 5406 m_restoreTimer.startOneShot(secondsBetweenRestoreAttempts); | 5406 m_restoreTimer.startOneShot(secondsBetweenRestoreAttempts); |
| 5407 else | 5407 } else { |
| 5408 // This likely shouldn't happen but is the best way to report it to
the WebGL app. | 5408 // This likely shouldn't happen but is the best way to report it to
the WebGL app. |
| 5409 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "", "error r
estoring context"); | 5409 synthesizeGLError(GL_INVALID_OPERATION, "", "error restoring context
"); |
| 5410 } |
| 5410 return; | 5411 return; |
| 5411 } | 5412 } |
| 5412 | 5413 |
| 5413 RefPtr<WebGLRenderingContextEvictionManager> contextEvictionManager = adoptR
ef(new WebGLRenderingContextEvictionManager()); | 5414 RefPtr<WebGLRenderingContextEvictionManager> contextEvictionManager = adoptR
ef(new WebGLRenderingContextEvictionManager()); |
| 5414 | 5415 |
| 5415 // Construct a new drawing buffer with the new GraphicsContext3D. | 5416 // Construct a new drawing buffer with the new GraphicsContext3D. |
| 5416 m_drawingBuffer->releaseResources(); | 5417 m_drawingBuffer->releaseResources(); |
| 5417 DrawingBuffer::PreserveDrawingBuffer preserve = m_attributes.preserveDrawing
Buffer ? DrawingBuffer::Preserve : DrawingBuffer::Discard; | 5418 DrawingBuffer::PreserveDrawingBuffer preserve = m_attributes.preserveDrawing
Buffer ? DrawingBuffer::Preserve : DrawingBuffer::Discard; |
| 5418 m_drawingBuffer = DrawingBuffer::create(context.get(), clampedCanvasSize(),
preserve, contextEvictionManager.release()); | 5419 m_drawingBuffer = DrawingBuffer::create(context.get(), clampedCanvasSize(),
preserve, contextEvictionManager.release()); |
| 5419 | 5420 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5473 { | 5474 { |
| 5474 for (int i = idx; i > 0; --i) | 5475 for (int i = idx; i > 0; --i) |
| 5475 m_buffers[i].swap(m_buffers[i-1]); | 5476 m_buffers[i].swap(m_buffers[i-1]); |
| 5476 } | 5477 } |
| 5477 | 5478 |
| 5478 namespace { | 5479 namespace { |
| 5479 | 5480 |
| 5480 String GetErrorString(GC3Denum error) | 5481 String GetErrorString(GC3Denum error) |
| 5481 { | 5482 { |
| 5482 switch (error) { | 5483 switch (error) { |
| 5483 case GraphicsContext3D::INVALID_ENUM: | 5484 case GL_INVALID_ENUM: |
| 5484 return "INVALID_ENUM"; | 5485 return "INVALID_ENUM"; |
| 5485 case GraphicsContext3D::INVALID_VALUE: | 5486 case GL_INVALID_VALUE: |
| 5486 return "INVALID_VALUE"; | 5487 return "INVALID_VALUE"; |
| 5487 case GraphicsContext3D::INVALID_OPERATION: | 5488 case GL_INVALID_OPERATION: |
| 5488 return "INVALID_OPERATION"; | 5489 return "INVALID_OPERATION"; |
| 5489 case GraphicsContext3D::OUT_OF_MEMORY: | 5490 case GL_OUT_OF_MEMORY: |
| 5490 return "OUT_OF_MEMORY"; | 5491 return "OUT_OF_MEMORY"; |
| 5491 case GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION: | 5492 case GL_INVALID_FRAMEBUFFER_OPERATION: |
| 5492 return "INVALID_FRAMEBUFFER_OPERATION"; | 5493 return "INVALID_FRAMEBUFFER_OPERATION"; |
| 5493 case GraphicsContext3D::CONTEXT_LOST_WEBGL: | 5494 case GC3D_CONTEXT_LOST_WEBGL: |
| 5494 return "CONTEXT_LOST_WEBGL"; | 5495 return "CONTEXT_LOST_WEBGL"; |
| 5495 default: | 5496 default: |
| 5496 return String::format("WebGL ERROR(0x%04X)", error); | 5497 return String::format("WebGL ERROR(0x%04X)", error); |
| 5497 } | 5498 } |
| 5498 } | 5499 } |
| 5499 | 5500 |
| 5500 } // namespace anonymous | 5501 } // namespace anonymous |
| 5501 | 5502 |
| 5502 void WebGLRenderingContext::synthesizeGLError(GC3Denum error, const char* functi
onName, const char* description, ConsoleDisplayPreference display) | 5503 void WebGLRenderingContext::synthesizeGLError(GC3Denum error, const char* functi
onName, const char* description, ConsoleDisplayPreference display) |
| 5503 { | 5504 { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 5527 void WebGLRenderingContext::applyStencilTest() | 5528 void WebGLRenderingContext::applyStencilTest() |
| 5528 { | 5529 { |
| 5529 bool haveStencilBuffer = false; | 5530 bool haveStencilBuffer = false; |
| 5530 | 5531 |
| 5531 if (m_framebufferBinding) | 5532 if (m_framebufferBinding) |
| 5532 haveStencilBuffer = m_framebufferBinding->hasStencilBuffer(); | 5533 haveStencilBuffer = m_framebufferBinding->hasStencilBuffer(); |
| 5533 else { | 5534 else { |
| 5534 RefPtr<WebGLContextAttributes> attributes = getContextAttributes(); | 5535 RefPtr<WebGLContextAttributes> attributes = getContextAttributes(); |
| 5535 haveStencilBuffer = attributes->stencil(); | 5536 haveStencilBuffer = attributes->stencil(); |
| 5536 } | 5537 } |
| 5537 enableOrDisable(GraphicsContext3D::STENCIL_TEST, | 5538 enableOrDisable(GL_STENCIL_TEST, |
| 5538 m_stencilEnabled && haveStencilBuffer); | 5539 m_stencilEnabled && haveStencilBuffer); |
| 5539 } | 5540 } |
| 5540 | 5541 |
| 5541 void WebGLRenderingContext::enableOrDisable(GC3Denum capability, bool enable) | 5542 void WebGLRenderingContext::enableOrDisable(GC3Denum capability, bool enable) |
| 5542 { | 5543 { |
| 5543 if (isContextLost()) | 5544 if (isContextLost()) |
| 5544 return; | 5545 return; |
| 5545 if (enable) | 5546 if (enable) |
| 5546 m_context->enable(capability); | 5547 m_context->enable(capability); |
| 5547 else | 5548 else |
| (...skipping 27 matching lines...) Expand all Loading... |
| 5575 return m_maxColorAttachments; | 5576 return m_maxColorAttachments; |
| 5576 } | 5577 } |
| 5577 | 5578 |
| 5578 void WebGLRenderingContext::setBackDrawBuffer(GC3Denum buf) | 5579 void WebGLRenderingContext::setBackDrawBuffer(GC3Denum buf) |
| 5579 { | 5580 { |
| 5580 m_backDrawBuffer = buf; | 5581 m_backDrawBuffer = buf; |
| 5581 } | 5582 } |
| 5582 | 5583 |
| 5583 void WebGLRenderingContext::restoreCurrentFramebuffer() | 5584 void WebGLRenderingContext::restoreCurrentFramebuffer() |
| 5584 { | 5585 { |
| 5585 bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_framebufferBinding.get()); | 5586 bindFramebuffer(GL_FRAMEBUFFER, m_framebufferBinding.get()); |
| 5586 } | 5587 } |
| 5587 | 5588 |
| 5588 void WebGLRenderingContext::restoreCurrentTexture2D() | 5589 void WebGLRenderingContext::restoreCurrentTexture2D() |
| 5589 { | 5590 { |
| 5590 bindTexture(GraphicsContext3D::TEXTURE_2D, m_textureUnits[m_activeTextureUni
t].m_texture2DBinding.get()); | 5591 bindTexture(GL_TEXTURE_2D, m_textureUnits[m_activeTextureUnit].m_texture2DBi
nding.get()); |
| 5591 } | 5592 } |
| 5592 | 5593 |
| 5593 void WebGLRenderingContext::multisamplingChanged(bool enabled) | 5594 void WebGLRenderingContext::multisamplingChanged(bool enabled) |
| 5594 { | 5595 { |
| 5595 if (m_multisamplingAllowed != enabled) { | 5596 if (m_multisamplingAllowed != enabled) { |
| 5596 m_multisamplingAllowed = enabled; | 5597 m_multisamplingAllowed = enabled; |
| 5597 forceLostContext(WebGLRenderingContext::AutoRecoverSyntheticLostContext)
; | 5598 forceLostContext(WebGLRenderingContext::AutoRecoverSyntheticLostContext)
; |
| 5598 } | 5599 } |
| 5599 } | 5600 } |
| 5600 | 5601 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 5619 if (m_textureUnits[i].m_texture2DBinding | 5620 if (m_textureUnits[i].m_texture2DBinding |
| 5620 || m_textureUnits[i].m_textureCubeMapBinding) { | 5621 || m_textureUnits[i].m_textureCubeMapBinding) { |
| 5621 m_onePlusMaxNonDefaultTextureUnit = i + 1; | 5622 m_onePlusMaxNonDefaultTextureUnit = i + 1; |
| 5622 return; | 5623 return; |
| 5623 } | 5624 } |
| 5624 } | 5625 } |
| 5625 m_onePlusMaxNonDefaultTextureUnit = 0; | 5626 m_onePlusMaxNonDefaultTextureUnit = 0; |
| 5626 } | 5627 } |
| 5627 | 5628 |
| 5628 } // namespace WebCore | 5629 } // namespace WebCore |
| OLD | NEW |