2727
2828#if __CC_METAL_SUPPORTED_AND_ENABLED
2929
30- #import < Metal/Metal.h>
30+ @implementation CCMetalContext
31+
32+ -(instancetype )init
33+ {
34+ if ((self = [super init ])){
35+ _device = MTLCreateSystemDefaultDevice ();
36+ }
37+
38+ return self;
39+ }
40+
41+ NSString *CURRENT_CONTEXT_KEY = @" CURRENT_CONTEXT_KEY" ;
42+
43+ +(instancetype )currentContext
44+ {
45+ return [NSThread currentThread ].threadDictionary [CURRENT_CONTEXT_KEY];
46+ }
47+
48+ +(void )setCurrentContext : (CCMetalContext *)context
49+ {
50+ if (context){
51+ [NSThread currentThread ].threadDictionary [CURRENT_CONTEXT_KEY] = context;
52+ } else {
53+ [[NSThread currentThread ].threadDictionary removeObjectForKey: CURRENT_CONTEXT_KEY];
54+ }
55+ }
56+
57+ @end
3158
3259
3360@implementation CCGraphicsBufferMetal {
61+ @public
3462 id <MTLBuffer > _buffer;
3563}
3664
3765-(instancetype )initWithCapacity : (NSUInteger )capacity elementSize : (size_t )elementSize type : (CCGraphicsBufferType)type ;
3866{
39- if ((self = [super init ])){
40- #warning TODO
41- id <MTLDevice > device = nil ;
42-
67+ if ((self = [super initWithCapacity: capacity elementSize: elementSize type: type])){
4368 // Use write combining? Buffers are already write only for the GL renderer.
44- _buffer = [device newBufferWithLength: capacity*elementSize options: MTLResourceOptionCPUCacheModeDefault ];
69+ _buffer = [[CCMetalContext currentContext ]. device newBufferWithLength: capacity*elementSize options: MTLResourceOptionCPUCacheModeDefault ];
4570
4671 _ptr = _buffer.contents ;
4772 }
@@ -53,7 +78,12 @@ -(void)destroy {}
5378
5479-(void )resize : (size_t )newCapacity ;
5580{
56- #warning TODO
81+ id <MTLBuffer > newBuffer = [[CCMetalContext currentContext ].device newBufferWithLength: newCapacity*_elementSize options: MTLResourceOptionCPUCacheModeDefault ];
82+ memcpy (newBuffer.contents , _ptr, _capacity*_elementSize);
83+
84+ _capacity = newCapacity;
85+ _buffer = newBuffer;
86+ _ptr = _buffer.contents ;
5787}
5888
5989-(void )prepare ;
@@ -65,6 +95,27 @@ -(void)commit; {}
6595
6696@end
6797
98+
99+ @implementation CCRenderCommandDrawMetal
100+
101+ static const MTLPrimitiveType MetalDrawModes[] = {
102+ GL_TRIANGLES,
103+ GL_LINES,
104+ };
105+
106+ -(void )invokeOnRenderer : (CCRenderer *)renderer
107+ {
108+ id <MTLRenderCommandEncoder > renderEncoder = [CCMetalContext currentContext ].currentRenderCommandEncoder ;
109+ CCGraphicsBufferMetal *indexBuffer = (CCGraphicsBufferMetal *)renderer->_elementBuffer ;
110+
111+ [renderEncoder pushDebugGroup: @" CCRendererCommandDraw: Invoke" ];
112+ [renderer setRenderState: _renderState];
113+ [renderEncoder drawIndexedPrimitives: MetalDrawModes[_mode] indexCount: _count indexType: MTLIndexTypeUInt16 indexBuffer: indexBuffer->_buffer indexBufferOffset: 2 *_first];
114+ [renderEncoder popDebugGroup ];
115+ }
116+
117+ @end
118+
68119#else
69120
70121// Temporary
0 commit comments