Implemented SDL_UpdateYUVTexture() for Direct3D
authorSam Lantinga <slouken@libsdl.org>
Sat, 28 Sep 2013 14:06:55 -0700
changeset 7761 bddbfca922cd
parent 7760 63b519624589
child 7762 51abf7664304
Implemented SDL_UpdateYUVTexture() for Direct3D
src/render/SDL_render.c
src/render/direct3d/SDL_render_d3d.c
--- a/src/render/SDL_render.c	Sat Sep 28 14:06:51 2013 -0700
+++ b/src/render/SDL_render.c	Sat Sep 28 14:06:55 2013 -0700
@@ -901,8 +901,12 @@
         SDL_assert(!texture->native);
         renderer = texture->renderer;
         SDL_assert(renderer->UpdateTextureYUV);
-        return renderer->UpdateTextureYUV(renderer, texture, rect, Yplane, Ypitch, Uplane, Upitch, Vplane, Vpitch);
-    }
+		if (renderer->UpdateTextureYUV) {
+			return renderer->UpdateTextureYUV(renderer, texture, rect, Yplane, Ypitch, Uplane, Upitch, Vplane, Vpitch);
+		} else {
+			return SDL_Unsupported();
+		}
+	}
 }
 
 static int
--- a/src/render/direct3d/SDL_render_d3d.c	Sat Sep 28 14:06:51 2013 -0700
+++ b/src/render/direct3d/SDL_render_d3d.c	Sat Sep 28 14:06:55 2013 -0700
@@ -211,6 +211,11 @@
 static int D3D_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
                              const SDL_Rect * rect, const void *pixels,
                              int pitch);
+static int D3D_UpdateTextureYUV(SDL_Renderer * renderer, SDL_Texture * texture,
+                                const SDL_Rect * rect,
+                                const Uint8 *Yplane, int Ypitch,
+                                const Uint8 *Uplane, int Upitch,
+                                const Uint8 *Vplane, int Vpitch);
 static int D3D_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
                            const SDL_Rect * rect, void **pixels, int *pitch);
 static void D3D_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture);
@@ -599,6 +604,7 @@
     renderer->WindowEvent = D3D_WindowEvent;
     renderer->CreateTexture = D3D_CreateTexture;
     renderer->UpdateTexture = D3D_UpdateTexture;
+	renderer->UpdateTextureYUV = D3D_UpdateTextureYUV;
     renderer->LockTexture = D3D_LockTexture;
     renderer->UnlockTexture = D3D_UnlockTexture;
     renderer->SetRenderTarget = D3D_SetRenderTarget;
@@ -1017,6 +1023,36 @@
 }
 
 static int
+D3D_UpdateTextureYUV(SDL_Renderer * renderer, SDL_Texture * texture,
+                     const SDL_Rect * rect,
+                     const Uint8 *Yplane, int Ypitch,
+                     const Uint8 *Uplane, int Upitch,
+                     const Uint8 *Vplane, int Vpitch)
+{
+	D3D_TextureData *data = (D3D_TextureData *) texture->driverdata;
+	SDL_bool full_texture = SDL_FALSE;
+
+#ifdef USE_DYNAMIC_TEXTURE
+	if (texture->access == SDL_TEXTUREACCESS_STREAMING &&
+		rect->x == 0 && rect->y == 0 &&
+		rect->w == texture->w && rect->h == texture->h) {
+			full_texture = SDL_TRUE;
+	}
+#endif
+
+	if (D3D_UpdateTextureInternal(data->texture, texture->format, full_texture, rect->x, rect->y, rect->w, rect->h, Yplane, Ypitch) < 0) {
+		return -1;
+	}
+	if (D3D_UpdateTextureInternal(data->utexture, texture->format, full_texture, rect->x / 2, rect->y / 2, rect->w / 2, rect->h / 2, Uplane, Upitch) < 0) {
+		return -1;
+	}
+	if (D3D_UpdateTextureInternal(data->vtexture, texture->format, full_texture, rect->x / 2, rect->y / 2, rect->w / 2, rect->h / 2, Vplane, Vpitch) < 0) {
+		return -1;
+	}
+	return 0;
+}
+
+static int
 D3D_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
                 const SDL_Rect * rect, void **pixels, int *pitch)
 {