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
e664e206
Commit
e664e206
authored
Oct 24, 2013
by
Jamie Madill
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor storage management in Texture3D.
TRAC #23976 Signed-off-by: Geoff Lang Signed-off-by: Shannon Woods
parent
3c0989c6
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
54 additions
and
53 deletions
+54
-53
Texture.cpp
src/libGLESv2/Texture.cpp
+51
-53
Texture.h
src/libGLESv2/Texture.h
+3
-0
No files found.
src/libGLESv2/Texture.cpp
View file @
e664e206
...
...
@@ -1798,16 +1798,12 @@ void Texture3D::subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GL
void
Texture3D
::
storage
(
GLsizei
levels
,
GLenum
internalformat
,
GLsizei
width
,
GLsizei
height
,
GLsizei
depth
)
{
delete
mTexStorage
;
mTexStorage
=
new
rx
::
TextureStorageInterface3D
(
mRenderer
,
levels
,
internalformat
,
IsRenderTargetUsage
(
mUsage
),
width
,
height
,
depth
);
mImmutable
=
true
;
for
(
int
level
=
0
;
level
<
levels
;
level
++
)
{
mImageArray
[
level
]
->
redefine
(
mRenderer
,
GL_TEXTURE_3D
,
internalformat
,
width
,
height
,
depth
,
true
);
width
=
std
::
max
(
1
,
width
>>
1
);
height
=
std
::
max
(
1
,
height
>>
1
);
depth
=
std
::
max
(
1
,
depth
>>
1
);
GLsizei
levelWidth
=
std
::
max
(
1
,
width
>>
level
);
GLsizei
levelHeight
=
std
::
max
(
1
,
height
>>
level
);
GLsizei
levelDepth
=
std
::
max
(
1
,
depth
>>
level
);
mImageArray
[
level
]
->
redefine
(
mRenderer
,
GL_TEXTURE_3D
,
internalformat
,
levelWidth
,
levelHeight
,
levelDepth
,
true
);
}
for
(
int
level
=
levels
;
level
<
IMPLEMENTATION_MAX_TEXTURE_LEVELS
;
level
++
)
...
...
@@ -1815,18 +1811,11 @@ void Texture3D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GL
mImageArray
[
level
]
->
redefine
(
mRenderer
,
GL_TEXTURE_3D
,
GL_NONE
,
0
,
0
,
0
,
true
);
}
if
(
mTexStorage
->
isManaged
())
{
int
levels
=
levelCount
();
mImmutable
=
true
;
for
(
int
level
=
0
;
level
<
levels
;
level
++
)
{
mImageArray
[
level
]
->
setManagedSurface
(
mTexStorage
,
level
);
}
}
setCompleteTexStorage
(
new
rx
::
TextureStorageInterface3D
(
mRenderer
,
levels
,
internalformat
,
IsRenderTargetUsage
(
mUsage
),
width
,
height
,
depth
));
}
void
Texture3D
::
generateMipmaps
()
{
// Purge array levels 1 through q and reset them to represent the generated mipmap levels.
...
...
@@ -2016,29 +2005,49 @@ int Texture3D::levelCount()
void
Texture3D
::
initializeStorage
(
bool
renderTarget
)
{
// Only initialize the first time this texture is used as a render target or shader resource
if
(
mTexStorage
)
{
return
;
}
// do not attempt to create storage for nonexistant data
if
(
!
isLevelComplete
(
0
))
{
return
;
}
bool
createRenderTarget
=
(
renderTarget
||
mUsage
==
GL_FRAMEBUFFER_ATTACHMENT_ANGLE
);
setCompleteTexStorage
(
createCompleteStorage
(
createRenderTarget
));
ASSERT
(
mTexStorage
);
// flush image data to the storage
updateStorage
();
}
rx
::
TextureStorageInterface3D
*
Texture3D
::
createCompleteStorage
(
bool
renderTarget
)
const
{
GLsizei
width
=
getBaseLevelWidth
();
GLsizei
height
=
getBaseLevelHeight
();
GLsizei
depth
=
getBaseLevelDepth
();
if
(
!
(
width
>
0
&&
height
>
0
&&
depth
>
0
))
return
;
// do not attempt to create native textures for nonexistant data
GLint
levels
=
creationLevels
(
width
,
height
,
depth
);
ASSERT
(
width
>
0
&&
height
>
0
&&
depth
>
0
);
delete
mTexStorage
;
mTexStorage
=
new
rx
::
TextureStorageInterface3D
(
mRenderer
,
levels
,
getBaseLevelInternalFormat
(),
IsRenderTargetUsage
(
mUsage
),
width
,
height
,
depth
);
if
(
mTexStorage
->
isManaged
())
{
int
levels
=
levelCount
();
// use existing storage level count, when previously specified by TexStorage*D
GLint
levels
=
(
mTexStorage
?
mTexStorage
->
levelCount
()
:
creationLevels
(
width
,
height
,
depth
));
for
(
int
level
=
0
;
level
<
levels
;
level
++
)
{
mImageArray
[
level
]
->
setManagedSurface
(
mTexStorage
,
level
);
}
}
return
new
rx
::
TextureStorageInterface3D
(
mRenderer
,
levels
,
getBaseLevelInternalFormat
(),
renderTarget
,
width
,
height
,
depth
);
}
void
Texture3D
::
setCompleteTexStorage
(
rx
::
TextureStorageInterface3D
*
newCompleteTexStorage
)
{
SafeDelete
(
mTexStorage
);
mTexStorage
=
newCompleteTexStorage
;
mDirtyImages
=
true
;
// We do not support managed 3D storage, as that is D3D9/ES2-only
ASSERT
(
!
mTexStorage
->
isManaged
());
}
void
Texture3D
::
updateStorage
()
...
...
@@ -2067,36 +2076,25 @@ void Texture3D::updateStorageLevel(int level)
bool
Texture3D
::
ensureRenderTarget
()
{
if
(
mTexStorage
&&
mTexStorage
->
isRenderTarget
())
{
return
true
;
}
rx
::
TextureStorageInterface3D
*
newTexStorage
=
NULL
;
initializeStorage
(
true
);
if
(
getBaseLevelWidth
()
!=
0
&&
getBaseLevelHeight
()
!=
0
&&
getBaseLevelDepth
()
!=
0
)
if
(
getBaseLevelWidth
()
>
0
&&
getBaseLevelHeight
()
>
0
&&
getBaseLevelDepth
()
>
0
)
{
GLsizei
width
=
getBaseLevelWidth
();
GLsizei
height
=
getBaseLevelHeight
();
GLsizei
depth
=
getBaseLevelDepth
();
GLint
levels
=
mTexStorage
!=
NULL
?
mTexStorage
->
levelCount
()
:
creationLevels
(
width
,
height
,
depth
);
newTexStorage
=
new
rx
::
TextureStorageInterface3D
(
mRenderer
,
levels
,
getBaseLevelInternalFormat
(),
true
,
width
,
height
,
depth
);
if
(
mTexStorage
!=
NULL
)
ASSERT
(
mTexStorage
);
if
(
!
mTexStorage
->
isRenderTarget
())
{
if
(
!
mRenderer
->
copyToRenderTarget
(
newTexStorage
,
mTexStorage
))
rx
::
TextureStorageInterface3D
*
newRenderTargetStorage
=
createCompleteStorage
(
true
);
if
(
!
mRenderer
->
copyToRenderTarget
(
newRenderTargetStorage
,
mTexStorage
))
{
delete
new
Tex
Storage
;
delete
new
RenderTarget
Storage
;
return
gl
::
error
(
GL_OUT_OF_MEMORY
,
false
);
}
setCompleteTexStorage
(
newRenderTargetStorage
);
}
}
delete
mTexStorage
;
mTexStorage
=
newTexStorage
;
mDirtyImages
=
true
;
return
(
mTexStorage
&&
mTexStorage
->
isRenderTarget
());
}
...
...
src/libGLESv2/Texture.h
View file @
e664e206
...
...
@@ -329,6 +329,9 @@ class Texture3D : public Texture
DISALLOW_COPY_AND_ASSIGN
(
Texture3D
);
virtual
void
initializeStorage
(
bool
renderTarget
);
rx
::
TextureStorageInterface3D
*
createCompleteStorage
(
bool
renderTarget
)
const
;
void
setCompleteTexStorage
(
rx
::
TextureStorageInterface3D
*
newCompleteTexStorage
);
virtual
void
updateStorage
();
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