Compare commits
	
		
			1 Commits
		
	
	
		
			6709dba
			...
			a3d193516c
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| a3d193516c | 
@@ -1,13 +1,15 @@
 | 
			
		||||
#include "./sdlrenderer_texture_uploader.hpp"
 | 
			
		||||
 | 
			
		||||
#include <cassert>
 | 
			
		||||
#include <cstdint>
 | 
			
		||||
#include <cstring>
 | 
			
		||||
 | 
			
		||||
SDLRendererTextureUploader::SDLRendererTextureUploader(SDL_Renderer* renderer_) :
 | 
			
		||||
	renderer(renderer_)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint64_t SDLRendererTextureUploader::uploadRGBA(const uint8_t* data, uint32_t width, uint32_t height, Filter filter) {
 | 
			
		||||
uint64_t SDLRendererTextureUploader::uploadRGBA(const uint8_t* data, uint32_t width, uint32_t height, Filter filter, Access access) {
 | 
			
		||||
	// TODO: test if pitch is 4 or 4*width
 | 
			
		||||
	SDL_Surface* surf = SDL_CreateSurfaceFrom(
 | 
			
		||||
		(void*)data,
 | 
			
		||||
@@ -17,6 +19,14 @@ uint64_t SDLRendererTextureUploader::uploadRGBA(const uint8_t* data, uint32_t wi
 | 
			
		||||
	);
 | 
			
		||||
	assert(surf); // TODO: add error reporting
 | 
			
		||||
 | 
			
		||||
	// hacky hint usage
 | 
			
		||||
	if (access == Access::STREAMING) {
 | 
			
		||||
		SDL_SetHint("SDL_TextureAccess", "SDL_TEXTUREACCESS_STREAMING");
 | 
			
		||||
	} else {
 | 
			
		||||
		SDL_SetHint("SDL_TextureAccess", "SDL_TEXTUREACCESS_STATIC");
 | 
			
		||||
	}
 | 
			
		||||
	// TODO: cleanup hints after
 | 
			
		||||
 | 
			
		||||
	SDL_Texture* tex = SDL_CreateTextureFromSurface(renderer, surf);
 | 
			
		||||
	assert(tex); // TODO: add error reporting
 | 
			
		||||
 | 
			
		||||
@@ -31,6 +41,27 @@ uint64_t SDLRendererTextureUploader::uploadRGBA(const uint8_t* data, uint32_t wi
 | 
			
		||||
	return reinterpret_cast<uint64_t>(tex);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool SDLRendererTextureUploader::updateRGBA(uint64_t tex_id, const uint8_t* data, size_t size) {
 | 
			
		||||
	auto* texture = static_cast<SDL_Texture*>(reinterpret_cast<void*>(tex_id));
 | 
			
		||||
	if (texture == nullptr) {
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	uint8_t* pixels = nullptr;
 | 
			
		||||
	int pitch = 0;
 | 
			
		||||
 | 
			
		||||
	if (SDL_LockTexture(texture, nullptr, (void**)&pixels, &pitch) != 0) {
 | 
			
		||||
		// TODO: error
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	std::memcpy(pixels, data, size);
 | 
			
		||||
 | 
			
		||||
	SDL_UnlockTexture(texture);
 | 
			
		||||
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLRendererTextureUploader::destroy(uint64_t tex_id) {
 | 
			
		||||
	SDL_DestroyTexture(static_cast<SDL_Texture*>(reinterpret_cast<void*>(tex_id)));
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,8 @@ struct SDLRendererTextureUploader : public TextureUploaderI {
 | 
			
		||||
	SDLRendererTextureUploader(SDL_Renderer* renderer_);
 | 
			
		||||
	~SDLRendererTextureUploader(void) = default;
 | 
			
		||||
 | 
			
		||||
	uint64_t uploadRGBA(const uint8_t* data, uint32_t width, uint32_t height, Filter filter) override;
 | 
			
		||||
	uint64_t uploadRGBA(const uint8_t* data, uint32_t width, uint32_t height, Filter filter, Access access) override;
 | 
			
		||||
	bool updateRGBA(uint64_t tex_id, const uint8_t* data, size_t size) override;
 | 
			
		||||
	void destroy(uint64_t tex_id) override;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,18 +1,29 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <cstdint>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
struct TextureUploaderI {
 | 
			
		||||
	static constexpr const char* version {"1"};
 | 
			
		||||
	static constexpr const char* version {"2"};
 | 
			
		||||
 | 
			
		||||
	enum Filter {
 | 
			
		||||
		NEAREST,
 | 
			
		||||
		LINEAR,
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	enum Access {
 | 
			
		||||
		STATIC,
 | 
			
		||||
		STREAMING,
 | 
			
		||||
		// target?
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	virtual ~TextureUploaderI(void) {}
 | 
			
		||||
 | 
			
		||||
	virtual uint64_t uploadRGBA(const uint8_t* data, uint32_t width, uint32_t height, Filter filter = LINEAR) = 0;
 | 
			
		||||
	virtual uint64_t uploadRGBA(const uint8_t* data, uint32_t width, uint32_t height, Filter filter = LINEAR, Access access = STATIC) = 0;
 | 
			
		||||
 | 
			
		||||
	// keeps width height filter
 | 
			
		||||
	// TODO: wh instead of size?
 | 
			
		||||
	virtual bool updateRGBA(uint64_t tex_id, const uint8_t* data, size_t size) = 0;
 | 
			
		||||
 | 
			
		||||
	virtual void destroy(uint64_t tex_id) = 0;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user