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
3c0989c6
Commit
3c0989c6
authored
Oct 24, 2013
by
Jamie Madill
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor storage management in TextureCube.
TRAC #23976 Signed-off-by: Geoff Lang Signed-off-by: Shannon Woods
parent
73b5d06e
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
50 additions
and
46 deletions
+50
-46
Texture.cpp
src/libGLESv2/Texture.cpp
+47
-46
Texture.h
src/libGLESv2/Texture.h
+3
-0
No files found.
src/libGLESv2/Texture.cpp
View file @
3c0989c6
...
...
@@ -1275,27 +1275,51 @@ bool TextureCubeMap::isDepth(GLenum target, GLint level) const
return
GetDepthBits
(
getInternalFormat
(
target
,
level
),
mRenderer
->
getCurrentClientVersion
())
>
0
;
}
// Constructs a native texture resource from the texture images, or returns an existing one
void
TextureCubeMap
::
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
(
!
isFaceLevelComplete
(
0
,
0
))
{
return
;
}
bool
createRenderTarget
=
(
renderTarget
||
IsRenderTargetUsage
(
mUsage
));
setCompleteTexStorage
(
createCompleteStorage
(
createRenderTarget
));
ASSERT
(
mTexStorage
);
// flush image data to the storage
updateStorage
();
}
rx
::
TextureStorageInterfaceCube
*
TextureCubeMap
::
createCompleteStorage
(
bool
renderTarget
)
const
{
GLsizei
size
=
getBaseLevelWidth
();
if
(
!
(
size
>
0
))
return
;
// do not attempt to create native textures for nonexistant data
ASSERT
(
size
>
0
);
GLint
levels
=
creationLevels
(
size
);
GL
enum
internalformat
=
getBaseLevelInternalFormat
(
);
// use existing storage level count, when previously specified by TexStorage*D
GL
int
levels
=
(
mTexStorage
?
mTexStorage
->
levelCount
()
:
creationLevels
(
size
)
);
delete
mTexStorage
;
mTexStorage
=
new
rx
::
TextureStorageInterfaceCube
(
mRenderer
,
levels
,
internalformat
,
IsRenderTargetUsage
(
mUsage
),
size
);
return
new
rx
::
TextureStorageInterfaceCube
(
mRenderer
,
levels
,
getBaseLevelInternalFormat
(),
renderTarget
,
size
)
;
}
if
(
mTexStorage
->
isManaged
())
{
int
levels
=
levelCount
();
void
TextureCubeMap
::
setCompleteTexStorage
(
rx
::
TextureStorageInterfaceCube
*
newCompleteTexStorage
)
{
SafeDelete
(
mTexStorage
);
mTexStorage
=
newCompleteTexStorage
;
if
(
mTexStorage
&&
mTexStorage
->
isManaged
())
{
for
(
int
faceIndex
=
0
;
faceIndex
<
6
;
faceIndex
++
)
{
for
(
int
level
=
0
;
level
<
levels
;
level
++
)
for
(
int
level
=
0
;
level
<
mTexStorage
->
levelCount
()
;
level
++
)
{
mImageArray
[
faceIndex
][
level
]
->
setManagedSurface
(
mTexStorage
,
faceIndex
,
level
);
}
...
...
@@ -1334,35 +1358,25 @@ void TextureCubeMap::updateStorageFaceLevel(int faceIndex, int level)
bool
TextureCubeMap
::
ensureRenderTarget
()
{
if
(
mTexStorage
&&
mTexStorage
->
isRenderTarget
())
{
return
true
;
}
rx
::
TextureStorageInterfaceCube
*
newTexStorage
=
NULL
;
initializeStorage
(
true
);
if
(
getBaseLevelWidth
()
!=
0
)
if
(
getBaseLevelWidth
()
>
0
)
{
GLsizei
size
=
getBaseLevelWidth
();
GLint
levels
=
mTexStorage
!=
NULL
?
mTexStorage
->
levelCount
()
:
creationLevels
(
size
);
GLenum
internalformat
=
getBaseLevelInternalFormat
();
newTexStorage
=
new
rx
::
TextureStorageInterfaceCube
(
mRenderer
,
levels
,
internalformat
,
true
,
size
);
if
(
mTexStorage
!=
NULL
)
ASSERT
(
mTexStorage
);
if
(
!
mTexStorage
->
isRenderTarget
())
{
if
(
!
mRenderer
->
copyToRenderTarget
(
newTexStorage
,
mTexStorage
))
rx
::
TextureStorageInterfaceCube
*
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
());
}
...
...
@@ -1500,10 +1514,6 @@ void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLi
void
TextureCubeMap
::
storage
(
GLsizei
levels
,
GLenum
internalformat
,
GLsizei
size
)
{
delete
mTexStorage
;
mTexStorage
=
new
rx
::
TextureStorageInterfaceCube
(
mRenderer
,
levels
,
internalformat
,
IsRenderTargetUsage
(
mUsage
),
size
);
mImmutable
=
true
;
for
(
int
level
=
0
;
level
<
levels
;
level
++
)
{
GLsizei
mipSize
=
std
::
max
(
1
,
size
>>
level
);
...
...
@@ -1521,18 +1531,9 @@ void TextureCubeMap::storage(GLsizei levels, GLenum internalformat, GLsizei size
}
}
if
(
mTexStorage
->
isManaged
())
{
int
levels
=
levelCount
();
mImmutable
=
true
;
for
(
int
faceIndex
=
0
;
faceIndex
<
6
;
faceIndex
++
)
{
for
(
int
level
=
0
;
level
<
levels
;
level
++
)
{
mImageArray
[
faceIndex
][
level
]
->
setManagedSurface
(
mTexStorage
,
faceIndex
,
level
);
}
}
}
setCompleteTexStorage
(
new
rx
::
TextureStorageInterfaceCube
(
mRenderer
,
levels
,
internalformat
,
IsRenderTargetUsage
(
mUsage
),
size
));
}
void
TextureCubeMap
::
generateMipmaps
()
...
...
src/libGLESv2/Texture.h
View file @
3c0989c6
...
...
@@ -267,6 +267,9 @@ class TextureCubeMap : public Texture
DISALLOW_COPY_AND_ASSIGN
(
TextureCubeMap
);
virtual
void
initializeStorage
(
bool
renderTarget
);
rx
::
TextureStorageInterfaceCube
*
createCompleteStorage
(
bool
renderTarget
)
const
;
void
setCompleteTexStorage
(
rx
::
TextureStorageInterfaceCube
*
newCompleteTexStorage
);
virtual
void
updateStorage
();
virtual
bool
ensureRenderTarget
();
virtual
rx
::
TextureStorageInterface
*
getStorage
(
bool
renderTarget
);
...
...
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