Open
Conversation
ScratchImage is very convenient as it automatically compute the
number of images, pitches etc. On the other hand, when the user
has an already loaded texture, it still always allocate own buffer
and perform copying, which might be suboptimal, especially with
large textures.
Extend ScratchImage::Initialize() with an additional argument (with
the default value that behaves the same way as before) to allow it
to be non-owning. This means that it still computes the number of
images, pitches etc., but doesn't allocate the actual buffer. Then,
the user can update individual images using
ScratchImage::SetNonOwningImagePixels().
The actual ScratchImage doesn't own this memory, doesn't have own
buffer and doesn't perform any deallocation on destruction. Memory
management and lifetimes are fully on the user's side.
A non-owning ScratchImage differs from owning by having a non-zero
m_size and m_memory == nullptr.
An example of usage:
// create ScratchImage using Initialize(meta, cp_flags, false)
// set pixels pointer for each image using
auto& image = *scratch.SetNonOwningImagePixels(mip, face, depth, ptr);
The return value is optional and is the same as
ScratchImage.GetImage(mip, face, depth), only to avoid 2 external
calls per subimage when needed. For example, if the user has a
contiguous buffer with a mipmapped 2D image:
for (size_t i{0}, off{0}; i < scratch.GetMetadata().mipLevels; ++i)
off += scratch.SetNonOwningImagePixels(i, 0, 0, ptr + off)->slicePitch;
A non-owning ScratchImage can currently be initialized only using
Initialize() for simplicity and to indicate that the option is for
advanced users only. Other Initialize*() methods can be expanded
later if needed.
Signed-off-by: Alexander Lobakin <alobakin@mailbox.org>
|
@solbjorn please read the following Contributor License Agreement(CLA). If you agree with the CLA, please reply with the following information.
Contributor License AgreementContribution License AgreementThis Contribution License Agreement (“Agreement”) is agreed to by the party signing below (“You”),
|
Author
|
@microsoft-github-policy-service agree |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ScratchImageis very convenient as it automatically compute the number of images, pitches etc. On the other hand, when the user has an already loaded texture, it still always allocate own buffer and perform copying, which might be suboptimal, especially with large textures.Extend
ScratchImage::Initialize()with an additional argument (with the default value that behaves the same way as before) to allow it to be non-owning. This means that it still computes the number of images, pitches etc., but doesn't allocate the actual buffer. Then, the user can update individual images usingScratchImage::SetNonOwningImagePixels().The actual
ScratchImagedoesn't own this memory, doesn't have own buffer and doesn't perform any deallocation on destruction. Memory management and lifetimes are fully on the user's side.A non-owning
ScratchImagediffers from owning by having a non-zerom_sizeandm_memory == nullptr.An example of usage:
The return value is optional and is the same as
ScratchImage.GetImage(mip, face, depth), only to avoid 2 external calls per subimage when needed. For example, if the user has a contiguous buffer with a mipmapped 2D image:A non-owning
ScratchImagecan currently be initialized only usingInitialize()for simplicity and to indicate that the option is for advanced users only. OtherInitialize*()methods can be expanded later if needed.