mirror of
https://github.com/italicsjenga/rust_minifb.git
synced 2024-12-23 19:31:30 +11:00
WIP on macOS resizing support
This commit is contained in:
parent
0e3bf4a7e2
commit
b4675905d2
|
@ -8,12 +8,12 @@
|
||||||
extern id<MTLDevice> g_metal_device;
|
extern id<MTLDevice> g_metal_device;
|
||||||
extern id<MTLCommandQueue> g_command_queue;
|
extern id<MTLCommandQueue> g_command_queue;
|
||||||
extern id<MTLLibrary> g_library;
|
extern id<MTLLibrary> g_library;
|
||||||
extern id<MTLRenderPipelineState> g_pipeline_state;
|
extern id<MTLRenderPipelineState> g_pipeline_state;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
NSString* g_shadersSrc = @
|
NSString* g_shadersSrc = @
|
||||||
" #include <metal_stdlib>\n"
|
" #include <metal_stdlib>\n"
|
||||||
"using namespace metal;\n"
|
"using namespace metal;\n"
|
||||||
|
|
||||||
"struct VertexOutput {\n"
|
"struct VertexOutput {\n"
|
||||||
|
@ -108,9 +108,9 @@ static bool create_shaders() {
|
||||||
|
|
||||||
// Error update
|
// Error update
|
||||||
if (nsError || !library) {
|
if (nsError || !library) {
|
||||||
NSLog(@"Unable to create shaders %@", nsError);
|
NSLog(@"Unable to create shaders %@", nsError);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSLog(@"Names %@", [g_library functionNames]);
|
NSLog(@"Names %@", [g_library functionNames]);
|
||||||
|
|
||||||
|
@ -173,7 +173,7 @@ void* mfb_open(const char* name, int width, int height, uint32_t flags, int scal
|
||||||
s_init = true;
|
s_init = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSWindowStyleMask styles = NSWindowStyleMaskClosable | NSWindowStyleMaskResizable;
|
NSWindowStyleMask styles = NSWindowStyleMaskClosable | NSWindowStyleMaskResizable;
|
||||||
|
|
||||||
if (flags & WINDOW_BORDERLESS)
|
if (flags & WINDOW_BORDERLESS)
|
||||||
styles |= NSWindowStyleMaskBorderless;
|
styles |= NSWindowStyleMaskBorderless;
|
||||||
|
@ -191,7 +191,7 @@ void* mfb_open(const char* name, int width, int height, uint32_t flags, int scal
|
||||||
if (!window)
|
if (!window)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
window->draw_buffer = malloc(width * height * 4);
|
window->draw_buffer = malloc((width * height * 4) * 8);
|
||||||
|
|
||||||
if (!window->draw_buffer)
|
if (!window->draw_buffer)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -199,7 +199,6 @@ void* mfb_open(const char* name, int width, int height, uint32_t flags, int scal
|
||||||
// Setup command queue
|
// Setup command queue
|
||||||
g_command_queue = [g_metal_device newCommandQueue];
|
g_command_queue = [g_metal_device newCommandQueue];
|
||||||
|
|
||||||
|
|
||||||
WindowViewController* viewController = [WindowViewController new];
|
WindowViewController* viewController = [WindowViewController new];
|
||||||
|
|
||||||
MTLTextureDescriptor* textureDescriptor = [[MTLTextureDescriptor alloc] init];
|
MTLTextureDescriptor* textureDescriptor = [[MTLTextureDescriptor alloc] init];
|
||||||
|
@ -213,7 +212,7 @@ void* mfb_open(const char* name, int width, int height, uint32_t flags, int scal
|
||||||
textureDescriptor.height = height;
|
textureDescriptor.height = height;
|
||||||
|
|
||||||
// Create the texture from the device by using the descriptor
|
// Create the texture from the device by using the descriptor
|
||||||
|
|
||||||
for (int i = 0; i < MaxBuffersInFlight; ++i) {
|
for (int i = 0; i < MaxBuffersInFlight; ++i) {
|
||||||
viewController->m_texture_buffers[i] = [g_metal_device newTextureWithDescriptor:textureDescriptor];
|
viewController->m_texture_buffers[i] = [g_metal_device newTextureWithDescriptor:textureDescriptor];
|
||||||
}
|
}
|
||||||
|
@ -223,13 +222,17 @@ void* mfb_open(const char* name, int width, int height, uint32_t flags, int scal
|
||||||
viewController->m_draw_buffer = window->draw_buffer;
|
viewController->m_draw_buffer = window->draw_buffer;
|
||||||
viewController->m_width = width;
|
viewController->m_width = width;
|
||||||
viewController->m_height = height;
|
viewController->m_height = height;
|
||||||
|
viewController->m_delayed_delete_count = 0;
|
||||||
|
|
||||||
MTKView* view = [[MTKView alloc] initWithFrame:rectangle];
|
MTKView* view = [[MTKView alloc] initWithFrame:rectangle];
|
||||||
view.device = g_metal_device;
|
view.device = g_metal_device;
|
||||||
view.delegate = viewController;
|
view.delegate = viewController;
|
||||||
view.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
|
view.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
|
||||||
[window.contentView addSubview:view];
|
[window.contentView addSubview:view];
|
||||||
|
|
||||||
|
OSXWindowFrameView* temp_view = window->frame_view;
|
||||||
|
temp_view->m_view_controller = viewController;
|
||||||
|
|
||||||
window->width = width;
|
window->width = width;
|
||||||
window->height = height;
|
window->height = height;
|
||||||
window->scale = scale;
|
window->scale = scale;
|
||||||
|
@ -451,7 +454,13 @@ int mfb_update(void* window, void* buffer)
|
||||||
int mfb_update_with_buffer(void* window, void* buffer)
|
int mfb_update_with_buffer(void* window, void* buffer)
|
||||||
{
|
{
|
||||||
OSXWindow* win = (OSXWindow*)window;
|
OSXWindow* win = (OSXWindow*)window;
|
||||||
memcpy(win->draw_buffer, buffer, win->width * win->height * 4);
|
|
||||||
|
if (win->shared_data) {
|
||||||
|
SharedData* shared_data = (SharedData*)win->shared_data;
|
||||||
|
memcpy(win->draw_buffer, buffer, shared_data->width * shared_data->height * 4);
|
||||||
|
} else {
|
||||||
|
memcpy(win->draw_buffer, buffer, win->width * win->height * 4);
|
||||||
|
}
|
||||||
|
|
||||||
int state = generic_update(win);
|
int state = generic_update(win);
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,7 @@ void build_submenu(NSMenu* menu, MenuDesc* desc);
|
||||||
@public int active_menu_id;
|
@public int active_menu_id;
|
||||||
@public int prev_cursor;
|
@public int prev_cursor;
|
||||||
@public MenuData* menu_data;
|
@public MenuData* menu_data;
|
||||||
|
@public void* frame_view;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -144,12 +144,19 @@
|
||||||
object:self];
|
object:self];
|
||||||
|
|
||||||
frameView = [[[OSXWindowFrameView alloc] initWithFrame:bounds] autorelease];
|
frameView = [[[OSXWindowFrameView alloc] initWithFrame:bounds] autorelease];
|
||||||
|
|
||||||
[super setContentView:frameView];
|
[super setContentView:frameView];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
frame_view = frameView;
|
||||||
|
|
||||||
if (childContentView)
|
if (childContentView)
|
||||||
[childContentView removeFromSuperview];
|
[childContentView removeFromSuperview];
|
||||||
|
|
||||||
|
printf("osxwindow: setContentFrameView %p\n", frameView);
|
||||||
|
//printf("osxwindow: setting controller %p\n", view_controller);
|
||||||
|
//frameView->m_view_controller = view_controller;
|
||||||
|
|
||||||
//NSRect t = [self contentRectForFrameRect:bounds];
|
//NSRect t = [self contentRectForFrameRect:bounds];
|
||||||
|
|
||||||
childContentView = aView;
|
childContentView = aView;
|
||||||
|
|
|
@ -6,13 +6,15 @@ const int MaxBuffersInFlight = 3;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@interface WindowViewController : NSViewController<MTKViewDelegate>
|
@interface WindowViewController : NSViewController<MTKViewDelegate>
|
||||||
{
|
{
|
||||||
@public id<MTLTexture> m_texture_buffers[MaxBuffersInFlight];
|
@public id<MTLTexture> m_texture_buffers[MaxBuffersInFlight];
|
||||||
|
@public id<MTLTexture> m_delayed_delete_textures[MaxBuffersInFlight];
|
||||||
@public int m_current_buffer;
|
@public int m_current_buffer;
|
||||||
@public void* m_draw_buffer;
|
@public void* m_draw_buffer;
|
||||||
@public int m_width;
|
@public int m_width;
|
||||||
@public int m_height;
|
@public int m_height;
|
||||||
|
@public int m_delayed_delete_count;
|
||||||
// Used for syncing with CPU/GPU
|
// Used for syncing with CPU/GPU
|
||||||
@public dispatch_semaphore_t m_semaphore;
|
@public dispatch_semaphore_t m_semaphore;
|
||||||
}
|
}
|
||||||
|
@ -23,6 +25,7 @@ const int MaxBuffersInFlight = 3;
|
||||||
|
|
||||||
@interface OSXWindowFrameView : NSView
|
@interface OSXWindowFrameView : NSView
|
||||||
{
|
{
|
||||||
|
@public WindowViewController* m_view_controller;
|
||||||
//@public int scale;
|
//@public int scale;
|
||||||
//@public int width;
|
//@public int width;
|
||||||
//@public int height;
|
//@public int height;
|
||||||
|
|
|
@ -178,6 +178,51 @@ id<MTLRenderPipelineState> g_pipeline_state;
|
||||||
object:[self window]];
|
object:[self window]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)viewDidEndLiveResize
|
||||||
|
{
|
||||||
|
//NSRect originalFrame = [win frame];
|
||||||
|
//NSRect contentRect = [NSWindow contentRectForFrameRect: originalFrame styleMask: NSWindowStyleMaskTitled];
|
||||||
|
NSSize size = [self bounds].size;
|
||||||
|
//NSSize size = [[self contentView] frame].size;
|
||||||
|
OSXWindow* window = (OSXWindow*)[self window];
|
||||||
|
|
||||||
|
int width = (int)size.width;
|
||||||
|
int height = (int)size.height;
|
||||||
|
|
||||||
|
// if windows is resized we need to create new textures so we do that here and put the old textures in a
|
||||||
|
// "to delete" queue and set a frame counter of 3 frames before the gets released
|
||||||
|
|
||||||
|
if (window->shared_data) {
|
||||||
|
if ((width != window->shared_data->width) ||
|
||||||
|
(height != window->shared_data->height)) {
|
||||||
|
|
||||||
|
MTLTextureDescriptor* textureDescriptor = [[MTLTextureDescriptor alloc] init];
|
||||||
|
|
||||||
|
// Indicate that each pixel has a blue, green, red, and alpha channel, where each channel is
|
||||||
|
// an 8-bit unsigned normalized value (i.e. 0 maps to 0.0 and 255 maps to 1.0)
|
||||||
|
textureDescriptor.pixelFormat = MTLPixelFormatBGRA8Unorm;
|
||||||
|
|
||||||
|
// Set the pixel dimensions of the texture
|
||||||
|
textureDescriptor.width = width;
|
||||||
|
textureDescriptor.height = height;
|
||||||
|
|
||||||
|
// Create the texture from the device by using the descriptor
|
||||||
|
|
||||||
|
m_view_controller->m_width = width;
|
||||||
|
m_view_controller->m_height = height;
|
||||||
|
|
||||||
|
for (int i = 0; i < MaxBuffersInFlight; ++i) {
|
||||||
|
m_view_controller->m_delayed_delete_count = 3;
|
||||||
|
m_view_controller->m_delayed_delete_textures[i] = m_view_controller->m_texture_buffers[i];
|
||||||
|
m_view_controller->m_texture_buffers[i] = [g_metal_device newTextureWithDescriptor:textureDescriptor];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window->shared_data->width = width;
|
||||||
|
window->shared_data->height = height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
- (void)dealloc
|
- (void)dealloc
|
||||||
|
@ -190,14 +235,6 @@ id<MTLRenderPipelineState> g_pipeline_state;
|
||||||
|
|
||||||
- (void)windowResized:(NSNotification *)notification
|
- (void)windowResized:(NSNotification *)notification
|
||||||
{
|
{
|
||||||
(void)notification;
|
|
||||||
NSSize size = [self bounds].size;
|
|
||||||
OSXWindow* window = (OSXWindow*)[self window];
|
|
||||||
|
|
||||||
if (window->shared_data) {
|
|
||||||
window->shared_data->width = (int)(size.width);
|
|
||||||
window->shared_data->height = (int)(size.height);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
Loading…
Reference in a new issue