static int s_maximumResourceUsePixels = 0;
#endif
static int s_currentResourceUsePixels = 0;
-static const float s_resourceAdjustedRatio = 0.5;
PassRefPtr<DrawingBuffer> DrawingBuffer::create(GraphicsContext3D* context, const IntSize& size, bool separateBackingTexture)
{
}
int pixelDelta = newSize.width() * newSize.height();
- int oldSize = 0;
- if (!m_size.isEmpty()) {
- oldSize = m_size.width() * m_size.height();
- pixelDelta -= oldSize;
- }
+ if (!m_size.isEmpty())
+ pixelDelta -= m_size.width() * m_size.height();
- IntSize adjustedSize = newSize;
- if (s_maximumResourceUsePixels) {
- while ((s_currentResourceUsePixels + pixelDelta) > s_maximumResourceUsePixels) {
- adjustedSize.scale(s_resourceAdjustedRatio);
- if (adjustedSize.isEmpty()) {
- clear();
- return false;
- }
- pixelDelta = adjustedSize.width() * adjustedSize.height();
- pixelDelta -= oldSize;
- }
+ if (s_maximumResourceUsePixels && (s_currentResourceUsePixels + pixelDelta) > s_maximumResourceUsePixels) {
+ clear();
+ return false;
}
+ s_currentResourceUsePixels += pixelDelta;
const GraphicsContext3D::Attributes& attributes = m_context->getContextAttributes();
- if (adjustedSize != m_size) {
+ if (newSize != m_size) {
+ m_size = newSize;
unsigned internalColorFormat, colorFormat, internalRenderbufferFormat;
if (attributes.alpha) {
internalRenderbufferFormat = Extensions3D::RGB8_OES;
}
- do {
- m_size = adjustedSize;
- // resize multisample FBO
- if (multisample()) {
- int maxSampleCount = 0;
+ // resize multisample FBO
+ if (multisample()) {
+ int maxSampleCount = 0;
+
+ m_context->getIntegerv(Extensions3D::MAX_SAMPLES, &maxSampleCount);
+ int sampleCount = std::min(4, maxSampleCount);
- m_context->getIntegerv(Extensions3D::MAX_SAMPLES, &maxSampleCount);
- int sampleCount = std::min(4, maxSampleCount);
+ m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_multisampleFBO);
- m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_multisampleFBO);
-
- m_context->bindRenderbuffer(GraphicsContext3D::RENDERBUFFER, m_multisampleColorBuffer);
- m_context->getExtensions()->renderbufferStorageMultisample(GraphicsContext3D::RENDERBUFFER, sampleCount, internalRenderbufferFormat, m_size.width(), m_size.height());
- m_context->framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::RENDERBUFFER, m_multisampleColorBuffer);
- resizeDepthStencil(sampleCount);
- if (m_context->checkFramebufferStatus(GraphicsContext3D::FRAMEBUFFER) != GraphicsContext3D::FRAMEBUFFER_COMPLETE) {
- adjustedSize.scale(s_resourceAdjustedRatio);
- continue;
- }
+ m_context->bindRenderbuffer(GraphicsContext3D::RENDERBUFFER, m_multisampleColorBuffer);
+ m_context->getExtensions()->renderbufferStorageMultisample(GraphicsContext3D::RENDERBUFFER, sampleCount, internalRenderbufferFormat, m_size.width(), m_size.height());
+ m_context->framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::RENDERBUFFER, m_multisampleColorBuffer);
+ resizeDepthStencil(sampleCount);
+ if (m_context->checkFramebufferStatus(GraphicsContext3D::FRAMEBUFFER) != GraphicsContext3D::FRAMEBUFFER_COMPLETE) {
+ // Cleanup
+ clear();
+ return false;
}
+ }
- // resize regular FBO
- m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_fbo);
-
- m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_colorBuffer);
- m_context->texImage2D(GraphicsContext3D::TEXTURE_2D, 0, internalColorFormat, m_size.width(), m_size.height(), 0, colorFormat, GraphicsContext3D::UNSIGNED_BYTE, 0);
-
- m_context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::TEXTURE_2D, m_colorBuffer, 0);
-
- // resize the backing color buffer
- if (m_separateBackingTexture) {
- m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_backingColorBuffer);
- m_context->texImage2D(GraphicsContext3D::TEXTURE_2D, 0, internalColorFormat, m_size.width(), m_size.height(), 0, colorFormat, GraphicsContext3D::UNSIGNED_BYTE, 0);
- }
+ // resize regular FBO
+ m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_fbo);
- m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, 0);
+ m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_colorBuffer);
+ m_context->texImage2D(GraphicsContext3D::TEXTURE_2D, 0, internalColorFormat, m_size.width(), m_size.height(), 0, colorFormat, GraphicsContext3D::UNSIGNED_BYTE, 0);
- if (!multisample())
- resizeDepthStencil(0);
- if (m_context->checkFramebufferStatus(GraphicsContext3D::FRAMEBUFFER) == GraphicsContext3D::FRAMEBUFFER_COMPLETE)
- break;
- adjustedSize.scale(s_resourceAdjustedRatio);
+ m_context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::TEXTURE_2D, m_colorBuffer, 0);
- } while (!adjustedSize.isEmpty());
+ // resize the backing color buffer
+ if (m_separateBackingTexture) {
+ m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_backingColorBuffer);
+ m_context->texImage2D(GraphicsContext3D::TEXTURE_2D, 0, internalColorFormat, m_size.width(), m_size.height(), 0, colorFormat, GraphicsContext3D::UNSIGNED_BYTE, 0);
+ }
- pixelDelta = m_size.width() * m_size.height();
- pixelDelta -= oldSize;
- s_currentResourceUsePixels += pixelDelta;
+ m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, 0);
- if (adjustedSize.isEmpty()) {
+ if (!multisample())
+ resizeDepthStencil(0);
+ if (m_context->checkFramebufferStatus(GraphicsContext3D::FRAMEBUFFER) != GraphicsContext3D::FRAMEBUFFER_COMPLETE) {
+ // Cleanup
clear();
return false;
}