void *thread_1_func(void *p) { (void)p; // unused VdpPresentationQueueTarget pq_target; VdpPresentationQueue pq; VdpOutputSurface out_surface; VdpOutputSurface out_surface_2; VdpBitmapSurface bmp_surface; ASSERT_OK(vdpPresentationQueueTargetCreateX11(device, window, &pq_target)); ASSERT_OK(vdpPresentationQueueCreate(device, pq_target, &pq)); ASSERT_OK(vdpOutputSurfaceCreate(device, VDP_RGBA_FORMAT_B8G8R8A8, 300, 150, &out_surface)); ASSERT_OK(vdpOutputSurfaceCreate(device, VDP_RGBA_FORMAT_B8G8R8A8, 300, 150, &out_surface_2)); ASSERT_OK(vdpBitmapSurfaceCreate(device, VDP_RGBA_FORMAT_B8G8R8A8, 300, 150, 1, &bmp_surface)); uint32_t buf[300*150]; for (uint32_t k = 0; k < 300*150; k ++) buf[k] = 0xff000000u + (k & 0xffffffu); const void * const source_data[] = { buf }; uint32_t source_pitches[] = { 4 * 300 }; ASSERT_OK(vdpBitmapSurfacePutBitsNative(bmp_surface, source_data, source_pitches, NULL)); VdpTime vdpTime = 0; ASSERT_OK(vdpPresentationQueueBlockUntilSurfaceIdle(pq, out_surface, &vdpTime)); ASSERT_OK(vdpPresentationQueueGetTime(pq, &vdpTime)); VdpOutputSurfaceRenderBlendState blend_state = { .blend_factor_source_color=VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE, .blend_factor_destination_color=VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ZERO, .blend_factor_source_alpha=VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE, .blend_factor_destination_alpha=VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ZERO, .blend_equation_color=VDP_OUTPUT_SURFACE_RENDER_BLEND_EQUATION_ADD, .blend_equation_alpha=VDP_OUTPUT_SURFACE_RENDER_BLEND_EQUATION_ADD, .blend_constant = { 0, 0, 0, 0} }; VdpRect source_rect = {0, 0, 300, 150}; VdpRect destination_rect = {0, 0, 300, 150}; ASSERT_OK(vdpOutputSurfaceRenderBitmapSurface(out_surface, &destination_rect, bmp_surface, &source_rect, NULL, &blend_state, VDP_OUTPUT_SURFACE_RENDER_ROTATE_0)); ASSERT_OK(vdpPresentationQueueDisplay(pq, out_surface, 0, 0, 0)); ASSERT_OK(vdpOutputSurfaceDestroy(out_surface)); ASSERT_OK(vdpOutputSurfaceDestroy(out_surface_2)); ASSERT_OK(vdpPresentationQueueDestroy(pq)); ASSERT_OK(vdpPresentationQueueTargetDestroy(pq_target)); ASSERT_OK(vdpBitmapSurfaceDestroy(bmp_surface)); return NULL; }
void test_bitmaps_of_format(VdpDevice device, int fmt, const char *fmt_name, uint32_t max_width, uint32_t max_height) { VdpBitmapSurface bmp_surf1; const uint32_t max_square_size = MIN(max_width, max_height); const uint32_t step = 128; // trying square surface for (uint32_t k = 0; k < max_square_size + step; (k < step) ? (k++) : (k+=step)) { for (uint32_t freq = 0; freq <= 1; freq ++) { const uint32_t size = MAX(1, MIN(k, max_square_size)); printf("trying square %s bitmap %d x %d (%d)\n", fmt_name, size, size, freq); ASSERT_OK(vdpBitmapSurfaceCreate(device, fmt, size, size, freq, &bmp_surf1)); ASSERT_OK(vdpBitmapSurfaceDestroy(bmp_surf1)); } } // width stretched for (uint32_t k = 0; k < max_width + step; (k < step) ? (k++) : (k+=step)) { for (uint32_t freq = 0; freq <= 1; freq ++) { const uint32_t size = MAX(1, MIN(k, max_width)); printf("trying width stretched %s bitmap %d x %d (%d)\n", fmt_name, size, 128, freq); ASSERT_OK(vdpBitmapSurfaceCreate(device, fmt, size, 128, freq, &bmp_surf1)); ASSERT_OK(vdpBitmapSurfaceDestroy(bmp_surf1)); } } // height stretched for (uint32_t k = 0; k < max_height + step; (k < step) ? (k++) : (k+=step)) { for (uint32_t freq = 0; freq <= 1; freq ++) { const uint32_t size = MAX(1, MIN(k, max_height)); printf("trying height stretched %s bitmap %d x %d (%d)\n", fmt_name, 128, size, freq); ASSERT_OK(vdpBitmapSurfaceCreate(device, fmt, 128, size, freq, &bmp_surf1)); ASSERT_OK(vdpBitmapSurfaceDestroy(bmp_surf1)); } } }
static void destroy_child_objects(int handle, void *item, void *p) { const void *parent = p; VdpGenericData *gh = item; if (gh) { if (parent == gh->deviceData) { switch (gh->type) { case HANDLETYPE_DEVICE: // do nothing break; case HANDLETYPE_PRESENTATION_QUEUE_TARGET: vdpPresentationQueueDestroy(handle); break; case HANDLETYPE_PRESENTATION_QUEUE: vdpPresentationQueueDestroy(handle); break; case HANDLETYPE_VIDEO_MIXER: vdpVideoMixerDestroy(handle); break; case HANDLETYPE_OUTPUT_SURFACE: vdpOutputSurfaceDestroy(handle); break; case HANDLETYPE_VIDEO_SURFACE: vdpVideoSurfaceDestroy(handle); break; case HANDLETYPE_BITMAP_SURFACE: vdpBitmapSurfaceDestroy(handle); break; case HANDLETYPE_DECODER: vdpDecoderDestroy(handle); break; default: traceError("warning (%s): unknown handle type %d\n", __func__, gh->type); break; } } } }