The document discusses AMD's RapidFire technology for remote graphics solutions. RapidFire uses dedicated cloud hardware and software to deliver multiple HD game streams from a single GPU with low latency. It has four independent components - the server, network, client, and user interface. The server performs GPU encoding of the desktop into an H264 video stream. The stream is sent to the client over the network, where it is decoded by the client hardware and displayed in the UI. RapidFire is designed to work across different hardware and support various use cases and workflows.
Driving Behavioral Change for Information Management through Data-Driven Gree...
RapidFire API for Optimized Workstation Graphics
1. RAPIDFIRE
API
FOR
WORKSTATIONS
BRUNO
STEFANIZZI
CHRISTOPHER
MAYER
DMITRY
KOZLOV
2. AMD
VDI
SOLUTIONS
Different
soluHons
for
each
workflows
GPU
APU
High End GPU
Low Power
Dual GPU card
High Density
High GPU density
• No Virtualization required
• Virtualization (VMWare, Citrix, Microsoft)
• 1-1
• 1-1 or 1-n
• High Performance/Watt/$ ratio
More flexibility in
workflow
Regular
workflow
•
Real time Graphics
High
Performance
Low
Power
Tablet
2
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
Notebook
Desktop
WorkstaHon
Large Data
•
•
Compute and Graphics
3. AMD GPU for Server
AMD
FirePro Sky
For
GPU
Compute
For
Virtualiza@on
For
Virtualiza@on
AMD Radeon Sky
Engineering
-‐
CAD/CAE
Media
&
Entertainment
Medical
Educa@on
&
Research
Cloud
Gaming
3
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
4. AMD RapidFire Technology
! Most
remote
graphics
soluHons
are
CPU
based
! RapidFire
is
dedicated
cloud
hardware
and
soVware
soluHon
with
API
to
simplify
integraHon
–
Deliver
more
HD
games
streams
per
GPU
with
low
latency
-‐>
6
x
HD
720p30
fps
–
Leverage
AMD
hardware
on
both
server
and
client
–
Runs
on
any
hardware
Low
Latency
HD
Image/Audio
Quality
4
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
Mul@ple
Streams
Virtualiza@on
Enablement
5. AMD RapidFire Technology
!
Design
for
many
use
cases
and
workflows
High
resolu@on
Collabora@ve
applica@on
with
mul@stream
5
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
Virtual
Desktop
Adap@ve
to
Network
environment
6. AMD RapidFire Technology
!
4
independent
components
using
soVware
and
hardware
acceleraHon
Server
! HW
H264
Encoding
Network
! AdapHve
protocol
Client
! HW
H264
Decoding
User
Interface
! Touch
! GPU
Encoding
! CPU
Decoding
! CPU
Encoding
! Custom
GPU
Decoding
! Mouse
! Plugins
Encoding
! MulH-‐plaeorm
(Win/
Linux/IOS/Android)
! MulH-‐plaeorm
! MulH-‐stream
! MulH-‐API
(DX9/11/
OpenGL/
OpenCL)
! EncrypHon
! Desktop
and
window
direct
encoding
6
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
! MulH-‐API
(DX9/11/
OpenGL/
OpenCL)
! Keyboard
7. RAPIDFIRE
TECHNOLOGY
DATA
FLOW
OVERVIEW
Client
Server
SERVER
SOFTWARE
NETWORK
NETWORK
FirePro
Sky
GPU
3D
ENGINE
ENCODE
FRAME
BUFFER
7
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
! RF
API
module
! external
module
DECODE
UI
FRAME
BUFFER
8. RAPIDFIRE
TECHNOLOGY
SERVER
SIDE
DATA
FLOW
FirePro
Sky
GPU
3D
ENGINE
EXECUTION
RESOURCES
FRAME
BUFFER
ENCODE
8
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
! Network
component
transfers
UI
events
from
the
client
to
the
server
Server
SERVER
SOFTWARE
NETWORK
9. RAPIDFIRE
TECHNOLOGY
SERVER
SIDE
DATA
FLOW
FirePro
Sky
GPU
3D
ENGINE
EXECUTION
RESOURCES
FRAME
BUFFER
ENCODE
9
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
! Network
component
transfers
UI
events
from
the
client
to
the
server
Server
SERVER
SOFTWARE
! Server
renders
the
desktop
NETWORK
10. RAPIDFIRE
TECHNOLOGY
SERVER
SIDE
DATA
FLOW
FirePro
Sky
GPU
3D
ENGINE
EXECUTION
RESOURCES
FRAME
BUFFER
ENCODE
10
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
! Network
component
transfers
UI
events
from
the
client
to
the
server
Server
SERVER
SOFTWARE
! Server
renders
the
desktop
NETWORK
11. RAPIDFIRE
TECHNOLOGY
SERVER
SIDE
DATA
FLOW
FirePro
Sky
GPU
3D
ENGINE
EXECUTION
RESOURCES
FRAME
BUFFER
ENCODE
11
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
! Network
component
transfers
UI
events
from
the
client
to
the
server
Server
SERVER
SOFTWARE
! Server
renders
the
desktop
NETWORK
! VCE
is
performing
asynchronous
desktop
capture
and
encoding
into
H264
video
stream
and
the
data
is
fetched
to
system
memory
by
the
app
12. RAPIDFIRE
TECHNOLOGY
SERVER
SIDE
DATA
FLOW
FirePro
Sky
GPU
3D
ENGINE
EXECUTION
RESOURCES
FRAME
BUFFER
ENCODE
12
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
! Network
component
transfers
UI
events
from
the
client
to
the
server
Server
SERVER
SOFTWARE
! Server
renders
the
desktop
NETWORK
! VCE
is
performing
asynchronous
desktop
capture
and
encoding
into
H264
video
stream
and
the
data
is
fetched
to
system
memory
by
the
app
! Video
stream
gets
send
to
the
client
13. RAPIDFIRE
TECHNOLOGY
CLIENT
SIDE
DATA
FLOW
! Client
receives
H264
stream
from
the
server
using
RTSP
protocol
Client
NETWORK
CLIENT
SOFTWARE
DECODE
AUDIO
Input
devices
DECODE
UI
Audio
device
Radeon
GPU
13
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
FRAME
BUFFER
14. RAPIDFIRE
TECHNOLOGY
CLIENT
SIDE
DATA
FLOW
!
Client
receives
H264
stream
from
the
server
using
RTSP
protocol
Client
NETWORK
CLIENT
SOFTWARE
DECODE
Input
devices
H264
DECODE
UI
Audio
device
Radeon
GPU
14
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
FRAME
BUFFER
! The
client
sends
the
stream
to
Radeon
GPU
which
performs
H264
hardware
decoding
to
the
frame
buffer
15. RAPIDFIRE
TECHNOLOGY
CLIENT
SIDE
DATA
FLOW
! Client
receives
H264
stream
from
the
server
using
RTSP
protocol
Client
NETWORK
CLIENT
SOFTWARE
DECODE
AUDIO
Input
devices
DECODE
! Sound
stream
is
decoded
using
soVware
audio
codec
and
sent
to
audio
hardware
UI
Audio
device
Radeon
GPU
15
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
! The
client
sends
the
stream
to
Radeon
GPU
which
performs
H264
hardware
decoding
to
the
frame
buffer
FRAME
BUFFER
16. RAPIDFIRE
TECHNOLOGY
CLIENT
SIDE
DATA
FLOW
! Client
receives
H264
stream
from
the
server
using
RTSP
protocol
Client
NETWORK
CLIENT
SOFTWARE
DECODE
AUDIO
Radeon
GPU
DECODE
! The
client
sends
the
stream
to
Radeon
GPU
which
performs
H264
hardware
decoding
to
the
frame
buffer
! Sound
stream
is
decoded
using
soVware
audio
codec
and
sent
to
audio
hardware
UI
! UI
events
are
collected
by
the
client
and
sent
over
the
network
to
the
server
Audio
device
16
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
Input
devices
FRAME
BUFFER
17. THE
RAPIDFIRE
API
COMPONENTS
" Server
component
The
server
component
provides
funcHons
for
the:
‒ Encoding
of
video
and
audio
data
‒ Color
space
conversion
‒ Capturing
of
the
desktop
‒ Handling
of
mulHple
render
targets
‒ Interoperability
with
OpenGL,
D3D9
and
D3D11
" Network
component
The
Network
component
is
a
sample
implementaHon
of
video
and
audio
streaming
based
on
the
LIVE555
Media
Server.
" User
Interface
The
UI
component
provide
funcHons
to:
‒ Capture
user
events
on
the
client
‒ Send
the
events
to
the
server
for
processing
" Client
component
The
client
component
provides
funcHons
for:
‒ Decoding
of
video
and
audio
streams
‒ Color
space
conversion
‒ Interoperability
with
OpenGL,
D3D9
and
D3D11
17
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
18. THE
RAPIDFIRE
API
THE
SERVER
COMPONENT
IniHalizaHon
Render
Loop
Create
RenderTarget
Draw
to
free
RenderTarget
rfCreateEncodeSession
rfRegisterRenderTarget
rfCreateEncoder
rfEncodeFrame
rfGetEncodedFrame
rfRtspServerSendFrame
Done?
18
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
19. THE
RAPIDFIRE
API
THE
SERVER
COMPONENT
IniHalizaHon
Create
RenderTarget
rfCreateEncodeSession
rfRegisterRenderTarget
rfCreateEncoder
" rfCreateEncodeSession
‒ Creates
an
encoding
session
on
the
server.
The
sessions
encapsulates
the
following
components:
‒ Rendering
context/device
‒ Compute
context
that
is
used
for
the
color
space
conversion
‒ Render
targets
‒ Desktop
‒ The
encoder:
SW,
VCE
or
IDENTITY
‒ The
following
session
types
are
supported
‒ OpenGL
‒ DX9
/
DX9Ex
‒ DX11
‒ Desktop
capturing
19
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
20. THE
RAPIDFIRE
API
THE
SERVER
COMPONENT
IniHalizaHon
Create
RenderTarget
rfCreateEncodeSession
rfRegisterRenderTarget
rfCreateEncoder
" rfCreateEncodeSession
‒ CreaHng
an
OpenGL
session
that
uses
the
VCE
HW
encoding
RFProperties
props[]
=
{
RF_GL_GRAPHICS_CTX,
(RFProperties)hGLRC,
RF_GL_DEVICE_CTX,
(RFProperties)hDC,
RF_ENCODER,
(RFProperties)RF_VCE,
0
};
//
Create
RapidFire
encoding
session
RFEncodeSession
session
=
rfCreateEncodeSession(props);
" rfRegisterRenderTargt
for
(unsigned
int
i
=
0;
i
<
NUM_RENDER_TARGETS;
i++)
{
rfRegisterRenderTarget(session,
RF_RT_GL_TEXTURE,
uiTexName[i],
uiWidth,
uiHeight,
&renderTargetIdx[i]));
}
‒ Input:
Name
of
the
OpenGL
Texture,
dimension
of
the
texture
‒ Output:
The
index
used
by
RF
to
idenHfy
this
render
target
20
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
21. THE
RAPIDFIRE
API
THE
SERVER
COMPONENT
IniHalizaHon
" rfCreateEncoder
‒ CreaHng
an
Encoder
using
a
preset
configuraHon
rfCreateEncoder(session,
uiWidth,
uiHeight,
RF_ENCODE_FAST)
Create
RenderTarget
‒ The
following
presets
are
supported:
rfCreateEncodeSession
rfRegisterRenderTarget
‒ RF_ENCODE_FAST
‒ RF_ENCODE_BALANCED
‒ RF_ENCODE_QUALITY
" rfCreateEncoder2
‒ CreaHng
an
encoder
using
properHes
rfCreateEncoder
//
Create
encoder
using
properties
RFProperties
props[]
=
{
RF_ENCODER_PROFILE,
(RFProperties)RF_MAIN,
RF_ENCODER_LEVEL,
(RFProperties)41,
RF_ENCODER_BITRATE,
(RFProperties)6000000,
RF_ENCODER_FPS,
(RFProperties)30,
0
};
rfCreateEncoder2(session,
uiWidth,
uiHeight,
props));
21
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
22. THE
RAPIDFIRE
API
THE
SERVER
COMPONENT
Render
Loop
" rfEncodeFrame
rfEncodeFrame(session,
renderTargetIdx[uiCurrentRT]));
Draw
to
free
RenderTarget
rfEncodeFrame
rfGetEncodedFrame
rfRtspServerSendFrame
Done?
‒ Non-‐blocking
call
to
submit
a
frame
for
encoding
" rfGetEncodedFrame
//
Check
if
encoded
frame
is
ready
if
(rfIsEncodedFrameReady(session))
{
if
(rfGetEncodedFrame(session,
&uiBitStreamSize,
(void**)&pBitStreamdata)
==
RF_STATUS_OK)
{
if
(uiBitStreamSize
>
0)
{
//
Send
encoded
frame
to
Network
rtspStatus
=
rfRtspServerSendFrame(rtsp_sn,
pBitStreamdata,
uiBitStreamSize,
tv.tv_sec,
tv.tv_usec,
1);
}
}
}
‒ Check
first
if
a
frame
is
ready
‒ If
a
frame
is
available
get
the
data
to
system
memory
‒ Send
the
frame
over
the
network
to
the
client
22
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
23. THE
RAPIDFIRE
API
THE
CLIENT
COMPONENT
IniHalizaHon
Render
Loop
Create
Target
Textures
Wait
to
receive
frame
rfCreateDecodeSession
rfDecodeFrame
rfRegisterTargetTexture
Display
frame
using
Target
Texture
rfCreateVideoDecoder
23
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
Done?
24. THE
RAPIDFIRE
API
THE
CLIENT
COMPONENT
IniHalizaHon
" rfCreateDecodeSession
‒ Creates
a
decoding
session
on
the
client.
The
sessions
encapsulates
the
following
components:
Create
Target
Textures
rfCreateDecodeSession
rfRegisterTargetTexture
rfCreateVideoDecoder
‒ Rendering
context/device
‒ Compute
context
that
is
used
for
the
color
space
conversion
‒ Target
Textures
‒ Decoder:
SW
or
UVD
‒ The
following
session
are
supported
‒ OpenGL
‒ DX9
/
DX9Ex
‒ DX11
24
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
25. THE
RAPIDFIRE
API
THE
CLIENT
COMPONENT
IniHalizaHon
Create
Target
Textures
rfCreateDecodeSession
rfRegisterTargetTexture
rfCreateVideoDecoder
" rfCreateDecodeSession
RFProperties
props[]
=
{
RF_GL_GRAPHICS_CTX,
(RFProperties)hGLRC,
RF_GL_DEVICE_CTX,
(RFProperties)hDC,
RF_DECODER,
(RFProperties)RF_UVD,
0
};
//
Create
RapidFire
decoding
session
RFDecSession
session
=
rfCreateDecodeSession(props);
‒ Creates
an
OpenGL
session
that
uses
the
UVD
decoder
" rfRegisterTargetTexture
rfRegisterTargetTexture(session,
uiTextureName);
‒ Registers
an
OpenGL
texture
‒ The
texture
will
be
used
to
store
the
decoded
frame
25
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
26. THE
RAPIDFIRE
API
THE
CLIENT
COMPONENT
IniHalizaHon
" rfCreateVideoDecoder
rfCreateVideoDecoder(session,
uiWidth,
uiHeight);
Create
Target
Textures
‒ Create
the
actual
decoder
rfCreateDecodeSession
rfRegisterTargetTexture
rfCreateVideoDecoder
26
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL
27. THE
RAPIDFIRE
API
THE
CLIENT
COMPONENT
Render
Loop
" rfDecodeFrame
rfDecodeFrame(session);
Wait
to
receive
frame
rfDecodeFrame
‒ Decodes
a
frame
‒ The
decoded
frame
is
stored
in
the
registered
texture
‒ Now
the
applicaHon
can
use
the
texture
to
display
the
frame
Display
frame
using
Target
Texture
Done?
27
|
PRESENTATION
TITLE
|
DECEMBER
4,
2013
|
CONFIDENTIAL