Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
angle
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
angle
Commits
73b5d06e
Commit
73b5d06e
authored
Oct 24, 2013
by
Jamie Madill
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor texture storage management in the Texture2D.
TRAC #23976 Signed-off-by: Geoff Lang Signed-off-by: Shannon Woods
parent
169d1118
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
71 additions
and
64 deletions
+71
-64
Texture.cpp
src/libGLESv2/Texture.cpp
+63
-59
Texture.h
src/libGLESv2/Texture.h
+8
-5
No files found.
src/libGLESv2/Texture.cpp
View file @
73b5d06e
...
@@ -639,15 +639,11 @@ void Texture2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yo
...
@@ -639,15 +639,11 @@ void Texture2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yo
void
Texture2D
::
storage
(
GLsizei
levels
,
GLenum
internalformat
,
GLsizei
width
,
GLsizei
height
)
void
Texture2D
::
storage
(
GLsizei
levels
,
GLenum
internalformat
,
GLsizei
width
,
GLsizei
height
)
{
{
delete
mTexStorage
;
mTexStorage
=
new
rx
::
TextureStorageInterface2D
(
mRenderer
,
levels
,
internalformat
,
IsRenderTargetUsage
(
mUsage
),
width
,
height
);
mImmutable
=
true
;
for
(
int
level
=
0
;
level
<
levels
;
level
++
)
for
(
int
level
=
0
;
level
<
levels
;
level
++
)
{
{
mImageArray
[
level
]
->
redefine
(
mRenderer
,
GL_TEXTURE_2D
,
internalformat
,
width
,
height
,
1
,
true
);
GLsizei
levelWidth
=
std
::
max
(
1
,
width
>>
level
);
width
=
std
::
max
(
1
,
width
>>
1
);
GLsizei
levelHeight
=
std
::
max
(
1
,
height
>>
level
);
height
=
std
::
max
(
1
,
height
>>
1
);
mImageArray
[
level
]
->
redefine
(
mRenderer
,
GL_TEXTURE_2D
,
internalformat
,
levelWidth
,
levelHeight
,
1
,
true
);
}
}
for
(
int
level
=
levels
;
level
<
IMPLEMENTATION_MAX_TEXTURE_LEVELS
;
level
++
)
for
(
int
level
=
levels
;
level
<
IMPLEMENTATION_MAX_TEXTURE_LEVELS
;
level
++
)
...
@@ -655,15 +651,25 @@ void Texture2D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GL
...
@@ -655,15 +651,25 @@ void Texture2D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GL
mImageArray
[
level
]
->
redefine
(
mRenderer
,
GL_TEXTURE_2D
,
GL_NONE
,
0
,
0
,
0
,
true
);
mImageArray
[
level
]
->
redefine
(
mRenderer
,
GL_TEXTURE_2D
,
GL_NONE
,
0
,
0
,
0
,
true
);
}
}
if
(
mTexStorage
->
isManaged
())
mImmutable
=
true
;
{
int
levels
=
levelCount
();
for
(
int
level
=
0
;
level
<
levels
;
level
++
)
setCompleteTexStorage
(
new
rx
::
TextureStorageInterface2D
(
mRenderer
,
levels
,
internalformat
,
IsRenderTargetUsage
(
mUsage
),
width
,
height
));
}
void
Texture2D
::
setCompleteTexStorage
(
rx
::
TextureStorageInterface2D
*
newCompleteTexStorage
)
{
SafeDelete
(
mTexStorage
);
mTexStorage
=
newCompleteTexStorage
;
if
(
mTexStorage
&&
mTexStorage
->
isManaged
())
{
for
(
int
level
=
0
;
level
<
mTexStorage
->
levelCount
();
level
++
)
{
{
mImageArray
[
level
]
->
setManagedSurface
(
mTexStorage
,
level
);
mImageArray
[
level
]
->
setManagedSurface
(
mTexStorage
,
level
);
}
}
}
}
mDirtyImages
=
true
;
}
}
// Tests for 2D texture sampling completeness. [OpenGL ES 2.0.24] section 3.8.2 page 85.
// Tests for 2D texture sampling completeness. [OpenGL ES 2.0.24] section 3.8.2 page 85.
...
@@ -802,30 +808,40 @@ bool Texture2D::isDepth(GLint level) const
...
@@ -802,30 +808,40 @@ bool Texture2D::isDepth(GLint level) const
}
}
// Constructs a native texture resource from the texture images
// Constructs a native texture resource from the texture images
void
Texture2D
::
createTexture
(
)
void
Texture2D
::
initializeStorage
(
bool
renderTarget
)
{
{
GLsizei
width
=
getBaseLevelWidth
();
// Only initialize the first time this texture is used as a render target or shader resource
GLsizei
height
=
getBaseLevelHeight
();
if
(
mTexStorage
)
{
return
;
}
if
(
!
(
width
>
0
&&
height
>
0
))
// do not attempt to create storage for nonexistant data
return
;
// do not attempt to create native textures for nonexistant data
if
(
!
isLevelComplete
(
0
))
{
return
;
}
GLint
levels
=
creationLevels
(
width
,
height
);
bool
createRenderTarget
=
(
renderTarget
||
IsRenderTargetUsage
(
mUsage
)
);
delete
mTexStorage
;
setCompleteTexStorage
(
createCompleteStorage
(
createRenderTarget
));
mTexStorage
=
new
rx
::
TextureStorageInterface2D
(
mRenderer
,
levels
,
getBaseLevelInternalFormat
(),
IsRenderTargetUsage
(
mUsage
),
width
,
height
);
ASSERT
(
mTexStorage
);
if
(
mTexStorage
->
isManaged
())
{
int
levels
=
levelCount
();
for
(
int
level
=
0
;
level
<
levels
;
level
++
)
// flush image data to the storage
{
updateStorage
();
mImageArray
[
level
]
->
setManagedSurface
(
mTexStorage
,
level
);
}
}
}
mDirtyImages
=
true
;
rx
::
TextureStorageInterface2D
*
Texture2D
::
createCompleteStorage
(
bool
renderTarget
)
const
{
GLsizei
width
=
getBaseLevelWidth
();
GLsizei
height
=
getBaseLevelHeight
();
ASSERT
(
width
>
0
&&
height
>
0
);
// use existing storage level count, when previously specified by TexStorage*D
GLint
levels
=
(
mTexStorage
?
mTexStorage
->
levelCount
()
:
creationLevels
(
width
,
height
));
return
new
rx
::
TextureStorageInterface2D
(
mRenderer
,
levels
,
getBaseLevelInternalFormat
(),
renderTarget
,
width
,
height
);
}
}
void
Texture2D
::
updateStorage
()
void
Texture2D
::
updateStorage
()
...
@@ -854,37 +870,25 @@ void Texture2D::updateStorageLevel(int level)
...
@@ -854,37 +870,25 @@ void Texture2D::updateStorageLevel(int level)
bool
Texture2D
::
ensureRenderTarget
()
bool
Texture2D
::
ensureRenderTarget
()
{
{
if
(
mTexStorage
&&
mTexStorage
->
isRenderTarget
())
initializeStorage
(
true
);
{
return
true
;
}
rx
::
TextureStorageInterface2D
*
newTexStorage
=
NULL
;
if
(
getBaseLevelWidth
()
>
0
&&
getBaseLevelHeight
()
>
0
)
GLsizei
width
=
getBaseLevelWidth
();
GLsizei
height
=
getBaseLevelHeight
();
if
(
width
!=
0
&&
height
!=
0
)
{
{
GLint
levels
=
mTexStorage
!=
NULL
?
mTexStorage
->
levelCount
()
:
creationLevels
(
width
,
height
);
ASSERT
(
mTexStorage
);
if
(
!
mTexStorage
->
isRenderTarget
())
newTexStorage
=
new
rx
::
TextureStorageInterface2D
(
mRenderer
,
levels
,
getBaseLevelInternalFormat
(),
true
,
width
,
height
);
if
(
mTexStorage
!=
NULL
)
{
{
if
(
!
mRenderer
->
copyToRenderTarget
(
newTexStorage
,
mTexStorage
))
rx
::
TextureStorageInterface2D
*
newRenderTargetStorage
=
createCompleteStorage
(
true
);
{
delete
newTexStorage
;
if
(
!
mRenderer
->
copyToRenderTarget
(
newRenderTargetStorage
,
mTexStorage
))
{
delete
newRenderTargetStorage
;
return
gl
::
error
(
GL_OUT_OF_MEMORY
,
false
);
return
gl
::
error
(
GL_OUT_OF_MEMORY
,
false
);
}
}
setCompleteTexStorage
(
newRenderTargetStorage
);
}
}
}
}
delete
mTexStorage
;
mTexStorage
=
newTexStorage
;
mDirtyImages
=
true
;
return
(
mTexStorage
&&
mTexStorage
->
isRenderTarget
());
return
(
mTexStorage
&&
mTexStorage
->
isRenderTarget
());
}
}
...
@@ -992,7 +996,7 @@ rx::TextureStorageInterface *Texture2D::getStorage(bool renderTarget)
...
@@ -992,7 +996,7 @@ rx::TextureStorageInterface *Texture2D::getStorage(bool renderTarget)
}
}
else
else
{
{
createTexture
(
);
initializeStorage
(
false
);
}
}
}
}
...
@@ -1272,7 +1276,7 @@ bool TextureCubeMap::isDepth(GLenum target, GLint level) const
...
@@ -1272,7 +1276,7 @@ bool TextureCubeMap::isDepth(GLenum target, GLint level) const
}
}
// Constructs a native texture resource from the texture images, or returns an existing one
// Constructs a native texture resource from the texture images, or returns an existing one
void
TextureCubeMap
::
createTexture
(
)
void
TextureCubeMap
::
initializeStorage
(
bool
renderTarget
)
{
{
GLsizei
size
=
getBaseLevelWidth
();
GLsizei
size
=
getBaseLevelWidth
();
...
@@ -1656,7 +1660,7 @@ rx::TextureStorageInterface *TextureCubeMap::getStorage(bool renderTarget)
...
@@ -1656,7 +1660,7 @@ rx::TextureStorageInterface *TextureCubeMap::getStorage(bool renderTarget)
}
}
else
else
{
{
createTexture
(
);
initializeStorage
(
false
);
}
}
}
}
...
@@ -2009,7 +2013,7 @@ int Texture3D::levelCount()
...
@@ -2009,7 +2013,7 @@ int Texture3D::levelCount()
return
mTexStorage
?
mTexStorage
->
levelCount
()
:
0
;
return
mTexStorage
?
mTexStorage
->
levelCount
()
:
0
;
}
}
void
Texture3D
::
createTexture
(
)
void
Texture3D
::
initializeStorage
(
bool
renderTarget
)
{
{
GLsizei
width
=
getBaseLevelWidth
();
GLsizei
width
=
getBaseLevelWidth
();
GLsizei
height
=
getBaseLevelHeight
();
GLsizei
height
=
getBaseLevelHeight
();
...
@@ -2162,7 +2166,7 @@ rx::TextureStorageInterface *Texture3D::getStorage(bool renderTarget)
...
@@ -2162,7 +2166,7 @@ rx::TextureStorageInterface *Texture3D::getStorage(bool renderTarget)
}
}
else
else
{
{
createTexture
(
);
initializeStorage
(
false
);
}
}
}
}
...
@@ -2580,7 +2584,7 @@ int Texture2DArray::levelCount()
...
@@ -2580,7 +2584,7 @@ int Texture2DArray::levelCount()
return
mTexStorage
?
mTexStorage
->
levelCount
()
:
0
;
return
mTexStorage
?
mTexStorage
->
levelCount
()
:
0
;
}
}
void
Texture2DArray
::
createTexture
(
)
void
Texture2DArray
::
initializeStorage
(
bool
renderTarget
)
{
{
GLsizei
width
=
getBaseLevelWidth
();
GLsizei
width
=
getBaseLevelWidth
();
GLsizei
height
=
getBaseLevelHeight
();
GLsizei
height
=
getBaseLevelHeight
();
...
@@ -2725,7 +2729,7 @@ rx::TextureStorageInterface *Texture2DArray::getStorage(bool renderTarget)
...
@@ -2725,7 +2729,7 @@ rx::TextureStorageInterface *Texture2DArray::getStorage(bool renderTarget)
}
}
else
else
{
{
createTexture
(
);
initializeStorage
(
false
);
}
}
}
}
...
...
src/libGLESv2/Texture.h
View file @
73b5d06e
...
@@ -127,7 +127,7 @@ class Texture : public RefCountObject
...
@@ -127,7 +127,7 @@ class Texture : public RefCountObject
GLint
creationLevels
(
GLsizei
size
)
const
;
GLint
creationLevels
(
GLsizei
size
)
const
;
int
mipLevels
()
const
;
int
mipLevels
()
const
;
virtual
void
createTexture
(
)
=
0
;
virtual
void
initializeStorage
(
bool
renderTarget
)
=
0
;
virtual
void
updateStorage
()
=
0
;
virtual
void
updateStorage
()
=
0
;
virtual
bool
ensureRenderTarget
()
=
0
;
virtual
bool
ensureRenderTarget
()
=
0
;
...
@@ -196,7 +196,10 @@ class Texture2D : public Texture
...
@@ -196,7 +196,10 @@ class Texture2D : public Texture
private
:
private
:
DISALLOW_COPY_AND_ASSIGN
(
Texture2D
);
DISALLOW_COPY_AND_ASSIGN
(
Texture2D
);
virtual
void
createTexture
();
virtual
void
initializeStorage
(
bool
renderTarget
);
rx
::
TextureStorageInterface2D
*
createCompleteStorage
(
bool
renderTarget
)
const
;
void
setCompleteTexStorage
(
rx
::
TextureStorageInterface2D
*
newCompleteTexStorage
);
virtual
void
updateStorage
();
virtual
void
updateStorage
();
virtual
bool
ensureRenderTarget
();
virtual
bool
ensureRenderTarget
();
virtual
rx
::
TextureStorageInterface
*
getStorage
(
bool
renderTarget
);
virtual
rx
::
TextureStorageInterface
*
getStorage
(
bool
renderTarget
);
...
@@ -263,7 +266,7 @@ class TextureCubeMap : public Texture
...
@@ -263,7 +266,7 @@ class TextureCubeMap : public Texture
private
:
private
:
DISALLOW_COPY_AND_ASSIGN
(
TextureCubeMap
);
DISALLOW_COPY_AND_ASSIGN
(
TextureCubeMap
);
virtual
void
createTexture
(
);
virtual
void
initializeStorage
(
bool
renderTarget
);
virtual
void
updateStorage
();
virtual
void
updateStorage
();
virtual
bool
ensureRenderTarget
();
virtual
bool
ensureRenderTarget
();
virtual
rx
::
TextureStorageInterface
*
getStorage
(
bool
renderTarget
);
virtual
rx
::
TextureStorageInterface
*
getStorage
(
bool
renderTarget
);
...
@@ -322,7 +325,7 @@ class Texture3D : public Texture
...
@@ -322,7 +325,7 @@ class Texture3D : public Texture
private
:
private
:
DISALLOW_COPY_AND_ASSIGN
(
Texture3D
);
DISALLOW_COPY_AND_ASSIGN
(
Texture3D
);
virtual
void
createTexture
(
);
virtual
void
initializeStorage
(
bool
renderTarget
);
virtual
void
updateStorage
();
virtual
void
updateStorage
();
virtual
bool
ensureRenderTarget
();
virtual
bool
ensureRenderTarget
();
...
@@ -379,7 +382,7 @@ class Texture2DArray : public Texture
...
@@ -379,7 +382,7 @@ class Texture2DArray : public Texture
private
:
private
:
DISALLOW_COPY_AND_ASSIGN
(
Texture2DArray
);
DISALLOW_COPY_AND_ASSIGN
(
Texture2DArray
);
virtual
void
createTexture
(
);
virtual
void
initializeStorage
(
bool
renderTarget
);
virtual
void
updateStorage
();
virtual
void
updateStorage
();
virtual
bool
ensureRenderTarget
();
virtual
bool
ensureRenderTarget
();
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment